Compartilhar via


Gerenciando permissões de conta

A LSA fornece várias funções que os aplicativos podem chamar para enumerar ou definir privilégios para contas de usuário, grupo e grupo local.

Antes de gerenciar as informações da conta, seu aplicativo deve obter um identificador para o objeto Policy local, conforme demonstrado em Abrir um Identificador de Objeto de Política. Além disso, para enumerar ou editar permissões para uma conta, você deve ter o SID ( identificador de segurança ) dessa conta. Seu aplicativo pode localizar um SID com o nome da conta, conforme descrito em Traduzindo entre nomes e SIDs.

Para acessar todas as contas que têm uma permissão específica, chame LsaEnumerateAccountsWithUserRight. Essa função preenche uma matriz com os SIDs de todas as contas que têm a permissão especificada.

Depois de obter o SID de uma conta, você pode modificar suas permissões. Chame LsaAddAccountRights para adicionar permissões à conta. Se a conta especificada não existir, LsaAddAccountRights a criará. Para remover permissões de uma conta, chame LsaRemoveAccountRights. Se você remover todas as permissões de uma conta, LsaRemoveAccountRights também excluirá a conta.

Seu aplicativo pode marcar as permissões atualmente atribuídas a uma conta chamando LsaEnumerateAccountRights. Essa função preenche uma matriz de estruturas LSA_UNICODE_STRING . Cada estrutura contém o nome de um privilégio mantido pela conta especificada.

O exemplo a seguir adiciona a permissão SeServiceLogonRight a uma conta. Neste exemplo, a variável AccountSID especifica o SID da conta. Para obter mais informações sobre como pesquisar um SID de conta, consulte Traduzindo entre nomes e SIDs.

#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));
  }
} 

No exemplo anterior, a função InitLsaString converte uma cadeia de caracteres Unicode em uma estrutura LSA_UNICODE_STRING . O código para essa função é mostrado em Usando cadeias de caracteres Unicode LSA.