LsaLookupSids2 函数 (ntsecapi.h)

LsaLookupSids2 函数查找与安全标识符数组相对应的名称,这些标识符 (SID) 并支持 Internet 提供程序标识。 如果 LsaLookupSids2 找不到与 SID 对应的名称,则函数以字符形式返回 SID。 应使用此函数而不是 LsaLookupSids 函数。

语法

NTSTATUS LsaLookupSids2(
  [in]  LSA_HANDLE                  PolicyHandle,
  [in]  ULONG                       LookupOptions,
  [in]  ULONG                       Count,
  [in]  PSID                        *Sids,
  [out] PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
  [out] PLSA_TRANSLATED_NAME        *Names
);

参数

[in] PolicyHandle

Policy 对象的句柄。 此句柄必须具有POLICY_LOOKUP_NAMES访问权限。 有关详细信息,请参阅 打开策略对象句柄

[in] LookupOptions

修改查找行为的标志。

含义
LSA_LOOKUP_DISALLOW_CONNECTED_ACCOUNT_INTERNET_SID
不允许来自已连接帐户的标识提供者的 Internet SID。 连接的帐户是在连接到联机标识提供者的本地 SAM 数据库中具有相应的影子帐户的帐户。 例如,MicrosoftAccount 是连接的帐户。
LSA_LOOKUP_PREFER_INTERNET_NAMES
返回 Internet 名称。 否则,将返回 nt4 样式名称 (domain\username) 。 如果指定了 Microsoft 帐户 Internet SID,则例外,在这种情况下,除非指定 了LSA_LOOKUP_DISALLOW_NON_WINDOWS_INTERNET_SID ,否则将返回 Internet 名称。
LSA_LOOKUP_RETURN_LOCAL_NAMES
即使对于 Internet 提供商标识,也始终返回本地 SAM 帐户名称。

[in] Count

指定 Sids 数组中的 SID 数。 这也是 在 Names 数组中返回的条目数。 此值必须小于或等于 20480。

[in] Sids

指向要查找的 SID 指针数组的指针。 SID 可以是众所周知的 SID、用户、组或本地组帐户 SID 或域 SID。

[out] ReferencedDomains

接收指向 指向LSA_REFERENCED_DOMAIN_LIST 结构的指针的指针。 此结构的 Domains 成员是一个数组,其中包含在其中找到 SID 的每个域的条目。 每个域的条目都包含域的 SID 和平面名称。 对于 Windows 域,平面名称是 NetBIOS 名称。 对于具有非 Windows 域的链接,平面名称是该域的标识名称,或者为 NULL

如果不再需要这些信息,请将返回的指针传递给 LsaFreeMemory。 即使函数因错误代码STATUS_NONE_MAPPED或STATUS_SOME_NOT_MAPPED而失败,也必须释放内存

[out] Names

接收指向 LSA_TRANSLATED_NAME 结构的数组的指针。 Names 数组中的每个条目都包含 Sids 数组中相应条目的名称信息。 对于帐户 SID,每个结构的 Name 成员都包含帐户的独立名称。 对于域 SID,Name 成员无效。

Names 数组中每个条目的 DomainIndex 成员是 ReferencedDomains 参数中返回的 Domains 数组中某个条目的索引。 索引标识在其中找到 SID 的域的域数组。

如果不再需要这些信息,请将返回的指针传递给 LsaFreeMemory。 即使函数因错误代码STATUS_NONE_MAPPED或STATUS_SOME_NOT_MAPPED而失败,也必须释放内存

返回值

如果函数成功,则返回值是以下 NTSTATUS 值之一。

返回代码 说明
STATUS_SOME_NOT_MAPPED
某些 SID 无法翻译。 这是一个信息级返回值。
STATUS_SUCCESS
所有 SID 都已找到并成功翻译。
 

如果函数失败,则返回值是 NTSTATUS 代码,可以是以下值之一或 LSA 策略函数返回值之一。

返回代码 说明
STATUS_NONE_MAPPED
没有翻译 SID。 这是错误级别的返回值。
STATUS_TOO_MANY_SIDS
Sids 数组参数太大。
 

可以使用 LsaNtStatusToWinError 函数将 NTSTATUS 代码转换为 Windows 错误代码。

注解

标志LSA_LOOKUP_PREFER_INTERNET_NAMES应用于 Internet 帐户,例如 MicrosoftAccount 和 Azure Active Directory 帐户。 指定此标志后,SID-Name 查找以 MicrosoftAccount\ 或 AzureAD\foo@outlook.comfoo@contoso.com 的形式返回帐户的 UPN。 对于 Microsoft 帐户,如果指定了此标志,则本地 SAM SID 和 Internet SID 都会导致 UPN 返回。 如果未指定LSA_LOOKUP_PREFER_INTERNET_NAMES,则为 AAD 帐户返回 AzureAD\foo 格式的 NT4 样式名称。 NT4 样式名称特定于计算机,应仔细评估其用法,如果可能,应避免使用。 对于 MicrosoftAccounts,如果未指定LSA_LOOKUP_PREFER_INTERNET_NAMES,则帐户的本地 SID 将转换为本地 SAM 名称,Internet SID 将转换为 UPN 名称。

对于帐户 SID,Name 成员中返回的字符串是帐户 (的独立名称,例如,user_name) 。 如果需要帐户的复合名称 (例如 Acctg\user_name) ,请从 ReferencedDomains 缓冲区获取域名,并追加反斜杠和独立名称。

如果 LsaLookupSids2 函数无法转换 SID,该函数将使用以下算法:

  1. 如果 SID 的域已知, 则 ReferencedDomains 缓冲区包含域的条目, 在 Names 参数中返回的字符串是帐户相对标识符的 Unicode 表示形式, (来自 SID 的 RID) 。
  2. 如果 SID 的域未知,则 Names 参数中返回的字符串是整个 SID 的 Unicode 表示形式,并且 ReferencedDomains 缓冲区中没有此 SID 的域记录。
除了为本地帐户、本地域帐户和显式受信任的域帐户查找 SID 外, LsaLookupSids2 还可以查找 Windows 林中任何域中任何帐户的 SID,包括仅在林中某个帐户的 SIDhistory 字段中显示的 SIDSIDhistory 字段存储已从另一个域移动的帐户的前 SID。 若要执行这些搜索,函数会查询林的全局编录。

要求

要求
最低受支持的客户端 Windows 8 [仅限桌面应用]
最低受支持的服务器 Windows Server 2012 [仅限桌面应用]
目标平台 Windows
标头 ntsecapi.h
Library Advapi32.lib
DLL Advapi32.dll

另请参阅

LSA_REFERENCED_DOMAIN_LIST

LSA_TRANSLATED_NAME

LsaOpenPolicy