概要
この記事では、サービスの作成時に回避する必要がある一般的な間違いについて説明します。 この記事では、Microsoft Windows サービスの作成に関するベストプラクティスについても説明します。 Windows サービスは、プログラム、ルーチン、または特定のシステム関数を実行して、特に低 (ハードウェア) レベルで他のプログラムをサポートするプロセスです。 Windows サービスの例としては、Microsoft Exchange や Microsoft SQL Server などのサーバー製品、およびコンピューターの時計を設定する Windows タイマーなどの他のクライアントアプリケーションがあります。 Windows サービスは、コンピューターを起動したときに自動的に開始され、ユーザーインターフェイスがありません。
詳細情報
Windows サービスの作成時には、次のガイドラインが役に立つことがあります。
-
ユーザーインターフェイスなしで使用するためにサービスを設計します。 サービスアプリケーションは、特定のユーザーコンテキストの外部で実行されるため、ユーザーの操作は必要ありません。 通常、これらのアプリケーションはバックグラウンドでタスクを実行します。 ユーザーの操作なしで実行するようにサービスを設計します。
-
対話型サービスは構築しないでください。 ユーザーによる操作なしでサービスを分離サービスとして実行します。対話型ユーザーが Windows サービスの同じインスタンスにログインしている場合、ウィンドウメッセージアタックが発生することがあります。 対話型のユーザーは、対話型サービスプロセスで任意のコードを挿入して実行できます。 対話型ユーザーが WM_COPYDATA メッセージを送信した場合は、安全な対話型サービスプロセスのアドレス空間に悪意のあるコードをコピーし、 WM_TIMER メッセージを送信します。その場合、サービスプロセスは悪意のあるコードを実行します。 この特権の昇格攻撃は、コンピューターまたは Microsoft ターミナルサービスを使用してコンピューターにログオンしているユーザーによって実行される可能性があります。
-
サービスを出荷する前に、すべての Assert ステートメントを削除します。 Microsoft では、 Assert メソッドの使用をお勧めしません。 Assertメソッドによって、エラーが発生したコード行を示すダイアログボックスが表示され、コードをデバッグするオプションが表示されます。 したがって、サービスを出荷する前に、すべての Assert ステートメントを削除します。
-
特定のセキュリティコンテキストでサービスを実行します。 システムを攻撃から保護するために、最小限のユーザー権利でサービスを実行します。 最小限のユーザーアカウントに割り当てられているユーザー権限よりも多くのユーザー権限が必要な場合は、管理者資格情報を持つユーザーとしてサービスを実行しないでください。 また、ビルトインログオン (システム、Anonymous Logon、ローカルサービス、ネットワークサービス) のユーザー権限を昇格させるために、セキュリティポリシーを変更しないようにします。 代わりに、カスタムアカウントを作成して、サービスで必要なユーザー権限をそのアカウントに付与します。 ネットワークの資格情報が必要な場合は、ドメインアカウントを使用します。 ネットワークの資格情報を必要としない場合は、ローカルアカウントを使用します。 ユーザー権限が制限されたカスタムアカウントの作成には、より多くの時間がかかる場合があります。ただし、ユーザー権限が多すぎる場合、またはオペレーティングシステムに含まれているアカウントにユーザー権限を追加した場合よりも安全です。
-
Windows サービスでは、印刷ドライブとマップされたドライブの両方を使用しないでください。 通常、印刷およびマップされたドライブは、特定のユーザーまたはユーザーのグループが利用できます。 印刷またはマップされたドライブを使用している場合は、サービスが印刷またはマップされたドライブにアクセスするために必要なユーザー権限を持つアカウントで実行されていることを確認してください。 通常、マップされたドライブはログオフした後に切断され、コンピューターにログオンしたときに再接続されます。
-
Windows サービスの作成時には、ユーザープロファイルの設定に依存しないようにします。
参照情報
Windows サービスの詳細については、次の Microsoft 開発者ネットワークの Web サイトを参照してください。
http://msdn2.microsoft.com/en-us/library/Aa983650(VS.71).aspx http://msdn2.microsoft.com/en-us/library/aa984074(VS.71).aspx