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.