管理帳戶許可權
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 會將 Unicode 字串轉換成 LSA_UNICODE_STRING 結構。 這個函式的代碼如 使用 LSA Unicode 字串所示。