管理帐户权限

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 字符串中。