共用方式為


管理帳戶許可權

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 字串中。