er4*_*z0r 11 windows active-directory vbscript
当我有他/她的 SID 时,如何在我的 AD 中找到用户。我不想依赖其他属性,因为我正在尝试检测对这些属性的更改。示例:我收到一条关于用户记录更改的消息,其中包含:
Message: User Account Changed:
Target Account Name: test12
Target Domain: DOMAIN
Target Account ID: %{S-1-5-21-3968247570-3627839482-368725868-1110}
Caller User Name: Administrator
Caller Domain: DOMAIN
Caller Logon ID: (0x0,0x62AB1)
Privileges: -
Run Code Online (Sandbox Code Playgroud)
我想通知用户有关更改。所以我需要他们来自 AD 的帐户信息。
Tim*_*ell 23
启动 Windows PowerShell 并运行:
$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$strSID>"
echo $uSid
Run Code Online (Sandbox Code Playgroud)
输出应该是这样的,
distinguishedName : {CN=John Doe,OU=Domain Admins,OU=People,OU=xxx,DC=xxx}
Path : LDAP://<SID=S-1-5-21-500000003-1000000000-1000000003-1001>
Run Code Online (Sandbox Code Playgroud)
执行此操作的“LDAP 方式”是检索具有 GUID(或 SID)的基础对象,这将仅检索基础对象而不附加附加的类数据。但是,您可以从此基础对象检索用户对象的实际“distinguishedName”。使用“distinguishedName”属性检索用户对象将返回具有完整类数据的 DirectoryEntry 对象 (.Net/C#/PowerShell) 或 iadsUser 对象 (VBScript),并允许您获取所需的任何其他属性数据。
问题是使用 GUID(或 SID)检索初始对象。有些消息来源会说您必须将字符串格式 GUID(即 {28c67c50-9778-47a4-a77a-bf56f238a0c4})转换为字节数组的字符串表示形式(即“\50\7c\c6\28\78 \97\a4\47\7a\a7\bf\56\f2\38\a0\c4") 传递给 LDAP。根据Microsoft 文档,情况并非如此。GUID/SID 的简单字符串表示就足够了。
下面是一个示例,说明如何通过 GUID 绑定到对象,然后检索具有完整类数据的实际用户对象。如果您与 GUID 绑定,Powershell 实际上会拉出完整的对象。如果您使用 VBScript,则需要执行两步过程。
另外,请注意,虽然 Microsoft 文档说多种 GUID 字符串格式是可以接受的,但我唯一能够成功使用的方法是去除 {}- 字符。 另外,请注意这不是正确的“字节数组”字符串,而只是去除了特殊字符的 GUID 字符串。
$strGUID = "{28c67c50-9778-47a4-a77a-bf56f238a0c4}" -replace '-|{|}',''
$guid = [ADSI]"LDAP://<GUID=$strGUID>"
$user = [ADSI]$guid.distinguishedName
Run Code Online (Sandbox Code Playgroud)
相同的过程可用于 SID 绑定。描述此内容的 MSDN 页面说有几种可用的 fstring 格式,但最常见的是 s-1-5-...-...-...-... 格式。
#Powershell
$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$uSid>"
$user = [ADSI]$user.distinguishedName
Run Code Online (Sandbox Code Playgroud)
* 查询 *
如果您要执行 LDAP 查询以查找对象(例如,通过将“objectGUID”与字节数组或“objectSID”与字节数组进行比较),那么您将需要执行“正确的”字节-数组转换。重要的是要注意字节数组与字符串表示的顺序不同,因为它存储为 GUID 的 DWORD-WORD-WORD-WORD-BYTES,并且确实考虑了字节序。转换 SID 的字节数组也有类似的条件。
有几种不同的方法可以完成转换,Technet 有一个简单的 vbScript 算法。您还可以使用 System.Guid 或通过 PowerShell 中的简单脚本对 C#/VB.Net 做一些更有趣的事情(一定要喜欢 PowerShell!):
#Powershell
# Creates a new System.GUID object from the supplied string.
# Only need for this example.
$guid = [system.guid]"{28c67c50-9778-47a4-a77a-bf56f238a0c4}"
$out=""
#Formats the array of integers as a backslash-delimited string of Hex values
$guid.ToByteArray() | %{ $out += $("\{0:x2}" -f $_) }
Run Code Online (Sandbox Code Playgroud)
然后,您应该能够使用标准 LDAP 过滤器查询对象:
(&(objectClass=User)(objectGUID=\50\7c\c6\28\78\97\a4\47\a7\7a\bf\56\f2\38\a0\c4))
Run Code Online (Sandbox Code Playgroud)
...或其他任何您可能会查询的内容。这也适用于 SID。