Gestion des autorisations de compte
Le LSA fournit plusieurs fonctions que les applications peuvent appeler pour énumérer ou définir des privilèges pour les comptes d’utilisateur, de groupe et de groupe local.
Avant de pouvoir gérer les informations de compte, votre application doit obtenir un handle pour l’objet Policy local, comme illustré dans Ouverture d’un handle d’objet de stratégie. En outre, pour énumérer ou modifier des autorisations pour un compte, vous devez disposer de l’identificateur de sécurité (SID) de ce compte. Votre application peut localiser un SID en fonction du nom du compte, comme décrit dans Traduction entre noms et SID.
Pour accéder à tous les comptes qui ont une autorisation particulière, appelez LsaEnumerateAccountsWithUserRight. Cette fonction remplit un tableau avec les SID de tous les comptes qui ont l’autorisation spécifiée.
Une fois que vous avez obtenu le SID d’un compte, vous pouvez modifier ses autorisations. Appelez LsaAddAccountRights pour ajouter des autorisations au compte. Si le compte spécifié n’existe pas, LsaAddAccountRights le crée. Pour supprimer des autorisations d’un compte, appelez LsaRemoveAccountRights. Si vous supprimez toutes les autorisations d’un compte, LsaRemoveAccountRights supprime également le compte.
Votre application peut case activée les autorisations actuellement attribuées à un compte en appelant LsaEnumerateAccountRights. Cette fonction remplit un tableau de structures LSA_UNICODE_STRING . Chaque structure contient le nom d’un privilège détenu par le compte spécifié.
L’exemple suivant ajoute l’autorisation SeServiceLogonRight à un compte. Dans cet exemple, la variable AccountSID spécifie le SID du compte. Pour plus d’informations sur la recherche d’un SID de compte, consultez Traduction entre des noms et des 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));
}
}
Dans l’exemple précédent, la fonction InitLsaString convertit une chaîne Unicode en structure LSA_UNICODE_STRING . Le code de cette fonction s’affiche dans Utilisation de chaînes Unicode LSA.