QueryServiceObjectSecurity 関数 (winsvc.h)

QueryServiceObjectSecurity 関数は、サービス オブジェクトに関連付けられているセキュリティ記述子のコピーを取得します。 GetNamedSecurityInfo 関数を使用して、セキュリティ記述子を取得することもできます。

構文

BOOL QueryServiceObjectSecurity(
  [in]            SC_HANDLE            hService,
  [in]            SECURITY_INFORMATION dwSecurityInformation,
  [out, optional] PSECURITY_DESCRIPTOR lpSecurityDescriptor,
  [in]            DWORD                cbBufSize,
  [out]           LPDWORD              pcbBytesNeeded
);

パラメーター

[in] hService

サービス コントロール マネージャーまたはサービスへのハンドル。 サービス コントロール マネージャーへのハンドルは OpenSCManager 関数によって返され、サービスへのハンドルは OpenService 関数または CreateService 関数によって返されます。 ハンドルには、READ_CONTROLアクセス権が必要です。

[in] dwSecurityInformation

取得するセキュリティ情報の種類を示すビット フラグのセット。 このパラメーターには 、SECURITY_INFORMATION ビット フラグの組み合わせを指定できますが、この関数は LABEL_SECURITY_INFORMATION 値をサポートしていないという例外があります。

[out, optional] lpSecurityDescriptor

指定したサービス オブジェクトのセキュリティ記述子のコピーを受け取るバッファーへのポインター。 呼び出しプロセスには、オブジェクトのセキュリティ記述子の指定された側面を表示するための適切なアクセス権が必要です。 SECURITY_DESCRIPTOR構造体は自己相対形式で返されます。

[in] cbBufSize

lpSecurityDescriptor パラメーターが指すバッファーのサイズ (バイト単位)。 使用できる最大サイズは 8 キロバイトです。

[out] pcbBytesNeeded

関数が失敗した場合に、要求されたセキュリティ記述子情報を返すために必要なバイト数を受け取る変数へのポインター。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

サービス コントロール マネージャーによって、次のエラー コードが設定される場合があります。 その他のエラー コードは、サービス コントロール マネージャーによって呼び出されるレジストリ関数によって設定される場合があります。

リターン コード 説明
ERROR_ACCESS_DENIED
指定したハンドルがREAD_CONTROLアクセスで開かなかったか、呼び出し元のプロセスが オブジェクトの所有者ではありません。
ERROR_INVALID_HANDLE
指定されたハンドルが無効です。
ERROR_INSUFFICIENT_BUFFER
セキュリティ記述子の情報が lpSecurityDescriptor バッファーに対して大きすぎます。 すべての情報を取得するために必要なバイト数は、 pcbBytesNeeded パラメーターで返されます。 lpSecurityDescriptor バッファーに書き込まれるものは何もありません。
ERROR_INVALID_PARAMETER
指定されたセキュリティ情報が無効です。

注釈

サービスが作成されると、サービス コントロール マネージャーはサービス オブジェクトに既定のセキュリティ記述子を割り当てます。 サービス オブジェクトのセキュリティ記述子のコピーを取得するには、 QueryServiceObjectSecurity 関数を呼び出します。 セキュリティ記述子を変更するには、 SetServiceObjectSecurity 関数を呼び出します。 サービス オブジェクトの既定のセキュリティ記述子の説明については、「 サービス セキュリティとアクセス権」を参照してください。

サービス オブジェクトのセキュリティ記述子から所有者、グループ、または DACL を読み取るために、呼び出し元のプロセスには、ハンドルが開かれたときにREAD_CONTROLアクセス権が付与されている必要があります。 READ_CONTROLアクセスを取得するには、呼び出し元がオブジェクトの所有者であるか、オブジェクトの DACL がアクセス権を付与する必要があります。

セキュリティ記述子から SACL を読み取る場合、呼び出し元のプロセスには、ハンドルが開かれたときにACCESS_SYSTEM_SECURITYアクセス権が付与されている必要があります。 このアクセスを取得する正しい方法は、呼び出し元の現在のトークンでSE_SECURITY_NAME特権を有効にし、ACCESS_SYSTEM_SECURITYアクセスのハンドルを開き、特権を無効にすることです。

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー winsvc.h (Windows.h を含む)
Library Advapi32.lib
[DLL] Advapi32.dll

こちらもご覧ください

CreateService

GetNamedSecurityInfo

低レベルのAccess Control

低レベルのAccess Control関数

OpenService

SECURITY_DESCRIPTOR

SetServiceObjectSecurity