Поделиться через


Управление разрешениями учетной записи

LSA предоставляет несколько функций, которые приложения могут вызывать для перечисления или задания привилегий для учетных записей пользователей, групп и локальных групп.

Прежде чем управлять сведениями об учетной записи, приложение должно получить дескриптор локального объекта Policy , как показано в разделе Открытие дескриптора объекта политики. Кроме того, для перечисления или изменения разрешений для учетной записи необходимо иметь идентификатор безопасности (SID) для этой учетной записи. Приложение может найти идентификатор безопасности по имени учетной записи, как описано в разделе Преобразование между именами и идентификаторами БЕЗОПАСНОСТИ.

Чтобы получить доступ ко всем учетным записям с определенным разрешением, вызовите LsaEnumerateAccountsWithUserRight. Эта функция заполняет массив идентификаторами безопасности всех учетных записей, имеющих указанное разрешение.

Получив идентификатор безопасности учетной записи, вы можете изменить ее разрешения. Вызовите LsaAddAccountRights , чтобы добавить разрешения для учетной записи. Если указанная учетная запись не существует, LsaAddAccountRights создает ее. Чтобы удалить разрешения из учетной записи, вызовите LsaRemoveAccountRights. Если удалить все разрешения из учетной записи, LsaRemoveAccountRights также удаляет учетную запись.

Приложение может проверка разрешения, назначенные учетной записи, вызвав LsaEnumerateAccountRights. Эта функция заполняет массив LSA_UNICODE_STRING структур. Каждая структура содержит имя привилегии, удерживаемой указанной учетной записью.

В следующем примере к учетной записи добавляется разрешение SeServiceLogonRight. В этом примере переменная AccountSID указывает идентификатор безопасности учетной записи. Дополнительные сведения о поиске идентификатора безопасности учетной записи см. в разделе Преобразование между именами и идентификаторами БЕЗОПАСНОСТИ.

#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 преобразует строку Юникода в LSA_UNICODE_STRING структуру. Код для этой функции показан в разделе Использование строк Юникода LSA.