Übersetzen zwischen Namen und SIDs

Die lokale Sicherheitsautorität (Local Security Authority , LSA) bietet Funktionen zum Übersetzen zwischen Benutzer-, Gruppen- und lokalen Gruppennamen und den entsprechenden Sid-Werten (Security Identifier ). Um Nach Kontonamen zu suchen, rufen Sie die LsaLookupNames-Funktion auf. Diese Funktion gibt die SID als RID/Domain-Indexpaar zurück. Um die SID als einzelnes Element abzurufen, rufen Sie die LsaLookupNames2-Funktion auf. Rufen Sie LsaLookupSids auf, um SIDs zu finden.

Diese Funktionen können Namen- und SID-Informationen aus jeder Domäne übersetzen, die vom lokalen System als vertrauenswürdig eingestuft wird.

Bevor Sie zwischen Kontonamen und SIDs übersetzen können, muss Ihre Anwendung ein Handle für das lokale Richtlinienobjekt abrufen, wie unter Öffnen eines Richtlinienobjekthandles veranschaulicht.

Im folgenden Beispiel wird die SID für ein Konto anhand des Kontonamens gesucht.

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

Im vorherigen Beispiel konvertiert die Funktion InitLsaString eine Unicode-Zeichenfolge in eine LSA_UNICODE_STRING-Struktur . Der Code für diese Funktion wird unter Verwenden von LSA-Unicode-Zeichenfolgen angezeigt.

Hinweis

Diese Übersetzungsfunktionen werden in erster Linie für die Verwendung durch Berechtigungs-Editoren zum Anzeigen von Informationen zur Zugriffssteuerungsliste (Access Control List , ACL) bereitgestellt. Ein Berechtigungs-Editor sollte diese Funktionen immer mithilfe des Policy-Objekts für das System aufrufen, in dem sich der Name oder die Sicherheits-ID-SID befindet. Dadurch wird sichergestellt, dass während der Übersetzung auf den richtigen Satz vertrauenswürdiger Domänen verwiesen wird.

 

Windows Access Control bietet auch Funktionen, die Übersetzungen zwischen SIDs und Kontonamen ausführen: LookupAccountName und LookupAccountSid. Wenn Ihre Anwendung einen Kontonamen oder eine SID suchen muss und keine zusätzliche LSA-Richtlinienfunktionalität verwendet, verwenden Sie die Windows-Access Control-Funktionen anstelle der LSA-Richtlinienfunktionen. Weitere Informationen zu diesen Funktionen finden Sie unter Access Control.