Traduction entre des noms et des SID

L’autorité de sécurité locale (LSA) fournit des fonctions permettant de traduire entre les noms d’utilisateur, de groupe et de groupe local et leurs valeurs d’identificateur de sécurité (SID) correspondantes. Pour rechercher des noms de compte, appelez la fonction LsaLookupNames . Cette fonction retourne le SID sous la forme d’une paire d’index RID/Domaine. Pour obtenir le SID en tant qu’élément unique, appelez la fonction LsaLookupNames2 . Pour localiser les SID, appelez LsaLookupSids.

Ces fonctions peuvent traduire les informations de nom et de SID à partir de n’importe quel domaine approuvé par le système local.

Avant de pouvoir traduire des noms de compte et des SID, votre application doit obtenir un handle pour l’objet policy local, comme illustré dans Ouverture d’un handle d’objet de stratégie.

L’exemple suivant recherche le SID pour un compte, en fonction du nom du compte.

void GetSIDInformation (LPWSTR AccountName,LSA_HANDLE PolicyHandle)
{
  LSA_UNICODE_STRING lucName;
  PLSA_TRANSLATED_SID ltsTranslatedSID;
  PLSA_REFERENCED_DOMAIN_LIST lrdlDomainList;
  LSA_TRUST_INFORMATION myDomain;
  NTSTATUS ntsResult;
  PWCHAR DomainString = NULL;

  // Initialize an LSA_UNICODE_STRING with the name.
  if (!InitLsaString(&lucName, AccountName))
  {
         wprintf(L"Failed InitLsaString\n");
         return;
  }

  ntsResult = LsaLookupNames(
     PolicyHandle,     // handle to a Policy object
     1,                // number of names to look up
     &lucName,         // pointer to an array of names
     &lrdlDomainList,  // receives domain information
     &ltsTranslatedSID // receives relative SIDs
  );
  if (STATUS_SUCCESS != ntsResult) 
  {
    wprintf(L"Failed LsaLookupNames - %lu \n",
      LsaNtStatusToWinError(ntsResult));
    return;
  }

  // Get the domain the account resides in.
  myDomain = lrdlDomainList->Domains[ltsTranslatedSID->DomainIndex];
  DomainString = (PWCHAR) LocalAlloc(LPTR, myDomain.Name.Length + 1);
  wcsncpy_s(DomainString,
     myDomain.Name.Length + 1, 
     myDomain.Name.Buffer, 
     myDomain.Name.Length);

  // Display the relative Id. 
  wprintf(L"Relative Id is %lu in domain %ws.\n",
    ltsTranslatedSID->RelativeId,
    DomainString);

  LocalFree(DomainString);
  LsaFreeMemory(ltsTranslatedSID);
  LsaFreeMemory(lrdlDomainList);
}

Dans l’exemple précédent, la fonction InitLsaString convertit une chaîne Unicode en structure LSA_UNICODE_STRING . Le code de cette fonction est indiqué dans Utilisation de chaînes Unicode LSA.

Notes

Ces fonctions de traduction sont principalement fournies pour être utilisées par les éditeurs d’autorisations pour afficher les informations de liste de contrôle d’accès (ACL). Un éditeur d’autorisations doit toujours appeler ces fonctions à l’aide de l’objet Policy pour le système où se trouve le nom ou le SID d’identificateur de sécurité . Cela garantit que l’ensemble approprié de domaines approuvés est référencé pendant la traduction.

 

Windows Access Control fournit également des fonctions qui effectuent des traductions entre les SID et les noms de compte : LookupAccountName et LookupAccountSid. Si votre application doit rechercher un nom de compte ou un SID et n’utilise pas de fonctionnalité de stratégie LSA supplémentaire, utilisez les fonctions Windows Access Control au lieu des fonctions stratégie LSA. Pour plus d’informations sur ces fonctions, consultez Access Control.