管理帳戶許可權
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 字串中。