在名称和 SID 之间转换

本地安全机构 (LSA) 提供函数,用于在用户、组和本地组名称及其相应的安全标识符 (SID) 值之间进行转换。 若要查找帐户名称,请调用 LsaLookupNames 函数。 此函数以 RID/域索引对的形式返回 SID。 若要获取单个元素的 SID,请调用 LsaLookupNames2 函数。 若要查找 SID,请调用 LsaLookupSids

这些函数可以转换本地系统信任的任何域中的名称和 SID 信息。

在帐户名称和 SID 之间进行转换之前,应用程序必须获取本地 Policy 对象的句柄,如 打开策略对象句柄中所述。

以下示例在给定帐户名称的情况下查找帐户的 SID。

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 将 Unicode 字符串转换为 LSA_UNICODE_STRING 结构。 此函数的代码显示在 使用 LSA Unicode 字符串中。

注意

这些转换函数主要供权限编辑器用来显示 访问控制列表 (ACL) 信息。 权限编辑器应始终使用名称或安全标识符 SID 所在的系统的 Policy 对象调用这些函数。 这可确保在转换期间引用正确的受信任域集。

 

Windows 访问控制 还提供在 SID 和帐户名称之间执行转换的函数:LookupAccountNameLookupAccountSid。 如果应用程序需要查找帐户名称或 SID,并且不使用其他 LSA 策略功能,请使用 Windows 访问控制 函数而不是 LSA 策略函数。 有关这些函数的详细信息,请参阅 访问控制