アカウントのアクセス許可の管理

LSA には、ユーザー、グループ、およびローカル グループ アカウントの 特権 を列挙または設定するためにアプリケーションが呼び出すことができるいくつかの関数が用意されています。

アカウント情報を管理するには、「ポリシー オブジェクト ハンドルを開く」で説明されているように、アプリケーションでローカル Policy オブジェクトへの ハンドルを取得する必要があります。 さらに、アカウントのアクセス許可を列挙または編集するには、そのアカウントの セキュリティ識別子 (SID) が必要です。 アプリケーションでは、「 名前と SID の変換」で説明されているように、アカウント名を指定して SID を見つけることができます。

特定のアクセス許可を持つすべてのアカウントにアクセスするには、 LsaEnumerateAccountsWithUserRight を呼び出します。 この関数は、指定されたアクセス許可を持つすべてのアカウントの SID を配列に設定します。

アカウントの SID を取得したら、そのアクセス許可を変更できます。 LsaAddAccountRights を呼び出して、アカウントにアクセス許可を追加します。 指定したアカウントが存在しない場合は、 LsaAddAccountRights によって作成されます。 アカウントからアクセス許可を削除するには、 LsaRemoveAccountRights を呼び出します。 アカウントからすべてのアクセス許可を削除すると、 LsaRemoveAccountRights によってアカウントも削除されます。

アプリケーションは、LsaEnumerateAccountRights を呼び出すことによって、アカウントに現在割り当てられているアクセス許可をチェックできます。 この関数は、 LSA_UNICODE_STRING 構造体の配列を設定します。 各構造体には、指定されたアカウントによって保持される特権の名前が含まれています。

次の例では、SeServiceLogonRight アクセス許可をアカウントに追加します。 この例では、AccountSID 変数でアカウントの SID を指定します。 アカウント SID を参照する方法の詳細については、「 名前と SID の変換」を参照してください。

#include <windows.h>
#include <ntsecapi.h>

void AddPrivileges(PSID AccountSID, LSA_HANDLE PolicyHandle)
{
  LSA_UNICODE_STRING lucPrivilege;
  NTSTATUS ntsResult;

  // Create an LSA_UNICODE_STRING for the privilege names.
  if (!InitLsaString(&lucPrivilege, L"SeServiceLogonRight"))
  {
         wprintf(L"Failed InitLsaString\n");
         return;
  }

  ntsResult = LsaAddAccountRights(
    PolicyHandle,  // An open policy handle.
    AccountSID,    // The target SID.
    &lucPrivilege, // The privileges.
    1              // Number of privileges.
  );                
  if (ntsResult == STATUS_SUCCESS) 
  {
    wprintf(L"Privilege added.\n");
  }
  else
  {
    wprintf(L"Privilege was not added - %lu \n",
      LsaNtStatusToWinError(ntsResult));
  }
} 

前の例では、InitLsaString 関数は Unicode 文字列を LSA_UNICODE_STRING 構造体に変換します。 この関数のコードについては、「 LSA Unicode 文字列の使用」を参照してください