管理帐户权限
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 字符串中。