계정 권한 관리

LSA는 애플리케이션이 사용자, 그룹 및 로컬 그룹 계정에 대한 권한을 열거하거나 설정하기 위해 호출할 수 있는 몇 가지 함수를 제공합니다.

계정 정보를 관리하려면 먼저 애플리케이션이 정책 개체 핸들 열기에 설명된 대로 로컬 정책 개체에 대한 핸들을 가져와야 합니다. 또한 계정에 대한 권한을 열거하거나 편집하려면 해당 계정에 대한 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 함수는 유니코드 문자열을 LSA_UNICODE_STRING 구조체로 변환합니다. 이 함수의 코드는 LSA 유니코드 문자열 사용에 표시됩니다.