0

我正在尝试获取用户的 SIP 地址,以便可以使用 JavaScript 对象检查他们在 Office Communicator 中的存在。这是我发现的一个脚本,与我想要做的类似。

Option Explicit
DIM objConnection, objCommand
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"

Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection 

Dim objOU, objUser, strUPN, strSIP, SIPLine
' Bind to the OU object.
Set objOU = GetObject("LDAP://chkenergy.net/DC=chkenergy,DC=net")

' Enumerate all users in the OU.
objOU.Filter = Array("user")
For Each objUser In objOU
' Skip computer objects.
 If (objUser.Class = "user") Then
  strUPN = objUser.userPrincipalName
  strSIP = objUser.get("msRTCSIP-PrimaryUserAddress")

  wscript.echo strSIP

End If

Next

基本上,我可以从 AD 获取他们的用户名,并且我想将其传入并取回他们的 SIP 地址 (strSIP)。有没有办法修复此代码以专门执行该任务?

4

1 回答 1

0

您发布的 vbscript 的问题是

  1. 它在客户端枚举用户,这将花费大量时间来找到正确的用户。同样,您可以运行 SQL 查询,而不是从数据库中提取所有记录并在客户端进行比较。正确的?
  2. 枚举仅在一个级别上完成。您必须修复代码才能进行递归枚举。但是,如果您修复它以进行递归枚举,则将需要更长的时间和更多的资源来完成您的工作。

在我回答你的问题之前,这里有一些关于 Active Directory 的基本背景知识。

  • Active Directory 上的用户对象包含许多属性。
  • 特别是,samAccountName 是您的 Windows 2000 之前的名称。
  • userPrincipalName 的格式为user@domain.name

您实际上可以使用 ADO 连接对象执行查询。由于您已绑定到 Active Directory,因此您可以执行 LDAP 查询。LDAP 查询字符串包含四个部分。

  • 根路径,我们开始搜索的地方。
  • LDAP 过滤器
  • 返回的属性
  • 搜索范围

您应该使用的 LDAP 查询字符串应该类似于

<LDAP://chkenergy.net/DC=chkenergy,DC=net>;(&(objectClass=user)(samAccountName=yourusername));msRTCSIP-PrimaryUserAddress;subtree
  • 上例中的根路径是<LDAP://chkenergy.net/DC=chkenergy,DC=net>.
  • LDAP 过滤器是(&(objectClass=user)(samAccountName=yourusername)). 当然,您需要yourusername在代码中替换为其他内容。我假设你可以传入一个 samAccountName。如果不是这种情况,您需要自己修改过滤器。
  • 返回的属性是msRTCSIP-PrimaryUserAddress. 我认为这就是你所需要的。正确的?
  • 我假设您正在尝试搜索同一域下的所有用户对象。所以,你的搜索范围应该是subtree

这是一个完整的示例,我想它应该可以完成您的工作

userName = "harvey"
ldapStr = "<LDAP://chkenergy.net/DC=chkenergy,DC=net>;(&(objectClass=user)(samAccountName=" & userName & "));msRTCSIP-PrimaryUserAddress;subtree"

Set conn = CreateObject("ADODB.Connection")
conn.Provider = "ADSDSOObject"
conn.Open "ADs Provider"
Set rs = conn.Execute(ldapStr)

While Not rs.EOF
   wscript.echo rs.Fields("msRTCSIP-PrimaryUserAddress")
   rs.MoveNext
Wend
于 2011-01-27T05:51:47.227 回答