Поделиться через


Преобразование между именами и идентификаторами безопасности

Локальный центр безопасности (LSA) предоставляет функции для преобразования имен пользователей, групп и локальных групп и их соответствующих значений идентификатора безопасности (SID). Чтобы найти имена учетных записей, вызовите функцию LsaLookupNames . Эта функция возвращает идентификатор безопасности в виде пары rid/domain index. Чтобы получить sid в виде одного элемента, вызовите функцию LsaLookupNames2 . Чтобы найти идентификаторы БЕЗОПАСНОСТИ, вызовите LsaLookupSids.

Эти функции могут преобразовывая информацию об имени и идентификаторе безопасности из любого домена, доверенного локальной системой.

Перед переводом между именами учетных записей и идентификаторами БЕЗОПАСНОСТИ приложение должно получить дескриптор локального объекта Политики , как показано в разделе Открытие дескриптора объекта политики.

В следующем примере выполняется поиск идентификатора безопасности для учетной записи с учетом имени учетной записи.

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

В предыдущем примере функция InitLsaString преобразует строку Юникода в LSA_UNICODE_STRING структуру. Код для этой функции показан в разделе Использование строк Юникода LSA.

Примечание

Эти функции перевода в основном предоставляются для использования редакторами разрешений для отображения сведений о списке управления доступом (ACL). Редактор разрешений всегда должен вызывать эти функции с помощью объекта Policy для системы, в которой находится идентификатор безопасности имени или идентификатора безопасности . Это гарантирует, что во время преобразования будет указан правильный набор доверенных доменов.

 

Windows контроль доступа также предоставляет функции, выполняющие преобразования между идентификаторами безопасности и именами учетных записей: LookupAccountName и LookupAccountSid. Если приложению нужно найти имя учетной записи или идентификатор безопасности и не использует дополнительные функции политики LSA, используйте функции Windows контроль доступа вместо функций Политики LSA. Дополнительные сведения об этих функциях см. в разделе контроль доступа.