Übersetzen zwischen Namen und SIDs

Die lokale Sicherheitsstelle (Local Security Authority, LSA) stellt Funktionen für die Übersetzung zwischen Benutzer-, Gruppen- und lokalen Gruppennamen und den entsprechenden SID-Werten (Security Identifier) zur Verfügung. Um Kontonamen zu suchen, rufen Sie die LsaLookupNames-Funktion auf. Diese Funktion gibt die SID als RID-/Domänenindexpaar zurück. Um die SID als einzelnes Element zu erhalten, rufen Sie die LsaLookupNames2-Funktion auf. Um SIDs zu suchen, rufen Sie LsaLookupSids auf.

Diese Funktionen können Namens- 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 Policy-Objekt erhalten, wie unter Öffnen eines Richtlinienobjekthandpunkts gezeigt.

Im folgenden Beispiel wird die SID für ein Konto unter Berücksichtigung des Kontonamens nach der SID durch sucht.

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 gezeigt.

Hinweis

Diese Übersetzungsfunktionen werden hauptsächlich von Berechtigungs-Editoren bereitgestellt, um Informationen zur Zugriffssteuerungsliste (Access Control List, ACL) anzuzeigen. Ein Berechtigungs-Editor sollte diese Funktionen immer mithilfe des Richtlinienobjekts 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 die richtigen vertrauenswürdigen Domänen verwiesen wird.

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