【问题标题】:VBScript returning 0 rows when ADSIEdit returns correct number of rows当 ADSIEdit 返回正确的行数时,VBScript 返回 0 行
【发布时间】:2011-08-23 03:03:34
【问题描述】:

在过去两天左右的时间里,我一直在努力解决这个问题,但没有取得太大的成功——无论我尝试什么。 当我运行查询以检索以特定结尾结尾的共享卷时,我让它在 ADSIEdit 中正常工作 - 但在我的 VBScript 中却没有。真的很奇怪,因为我使用的是完全相同的查询。

ADSIEdit 查询配置如下:

  • 名称:测试
  • 搜索根:DC=ad,DC=server,DC=com
  • 查询字符串:(&(objectCategory=volume)(objectClass=volume)(cn=K_*))
  • 查询范围:子树搜索。

    • 搜索结果:cn以K_开头的11条记录
    • VbScript 结果:1 条记录 (!?!?)

如果我将查询字符串更改为(最后一部分)(uNCName=*\5cOst-gro)),这就是我真正想要的(我给出的第一个查询字符串是出于测试目的),在 ADSIEdit 中返回 7 行 - 在我的 VBScript 中没有!

这是我的(当前)VBScript 代码:

Set objDomain = getObject("LDAP://RootDSE")
Set objSysInfo = CreateObject("ADSystemInfo")
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand =   CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection

strDNSDomain = objDomain.Get("defaultNamingContext")

objCommand.CommandText = "Select Name, uNCName, ManagedBy from "_
    & "'LDAP://DC=ad,DC=server,DC=com'" _
        & " where objectClass='volume' and uNCName = '*\5cOst-gro'"
        'The below is not working either!
'objCommand.CommandText = "<LDAP://DC=ad,DC=server,DC=com>;"_
'    & "(&(objectCategory=volume)(objectClass=volume)(uNCName=*\5cOst-gro));"_
'       & "name,uNCName;subtree"
Set objRecordSet = objCommand.Execute( , , adCmdTableDirect)
avarGetRowsArray = objRecordset.GetRows(intNumRows, BkMrk) ' returns 0 too
objRecordSet.MoveFirst ' Doesn't help
If objRecordSet.Supports(adApproxPosition)=True Then
    nrRecords=objRecordSet.RecordCount
End If
if not objRecordSet.EOF Then 
    do While Not objRecordSet.EOF 
        MsgBox "Match found! " & objRecordSet.Fields("name").Value, vbOKOnly, "Match found"
        objRecordSet.MoveNext 
    Loop 
Else 
    MsgBox "No matches found. " & UBound(avarGetRowsArray), vbOKOnly, "No matches!"
end If 

希望有人可以提供帮助。我有read countless topics,但每一个都失败了:(

编辑:我认为我已经将其归结为信任/许可问题。当我在 AD 机器上运行 adfind(或 dsquery)时,它返回正确的行数。但是,如果我在客户端机器上运行它,它会返回错误的行数。现在的问题是,如何解决这个问题?

服务器:

D:\Tests>adfind -c -f "(&(objectCategory=volume)(objectClass=volume)(uNCName=*\5
cOst-gro))"

AdFind V01.45.00cpp Joe Richards (joe@joeware.net) March 2011

Using server: ad.server.com:389
Directory: Windows Server 2003
Base DN: DC=ad,DC=server,DC=com

7 Objects returned

D:\Tests>

客户:

C:\tests>adfind -c -f "(&(objectCategory=volume)(objectClass=volume)(uNCName=*\5
cOst-gro))"

AdFind V01.45.00cpp Joe Richards (joe@joeware.net) March 2011

Using server: ad.server.com:389
Directory: Windows Server 2003
Base DN: DC= DC=ad,DC=server,DC=com

0 Objects returned

C:\tests>adfind -c -f "(&(objectCategory=volume)(objectClass=volume)(cn=K_*))"

AdFind V01.45.00cpp Joe Richards (joe@joeware.net) March 2011

Using server: ad.server.com:389
Directory: Windows Server 2003
Base DN: DC= DC=ad,DC=server,DC=com

1 Objects returned

【问题讨论】:

  • 在您的查询中,您想使用 (uNCName=*\5cOst-gro)。 *\5 在您的脑海中意味着什么。我想知道是否有转义问题。
  • @geoffc \5c 是反斜杠 (\) 的替代品,我从 ADSIEdit 中获取了它。换句话说,在这种情况下,它将搜索 *\Ost-gro(例如,成功的命中将是 ad.server.com\shares\Ost-gro)
  • #Exodus 所以我想知道转义是否解释了 ADSIEdit 与 VBScript 的差异。
  • @geoffc 这也是我的第一个怀疑,但我已经测试了两者,没有区别......但是,我确实发现了一些有趣的东西。我使用 dsquery 和 adfind 进行了更多测试,查询返回的结果取决于我运行它们的位置;实际的 AD 服务器或客户端。我想我正在做某事......

标签: vbscript ldap adodb adsi


【解决方案1】:

@exodus:您的转义符号是错误。如果要搜索反斜杠,则必须使用“\5C”(大写)。 hier 是更多详细信息的链接:http://www.rlmueller.net/CharactersEscaped.htm

【讨论】:

  • 不幸的是,这也没有帮助:(我目前的解决方法是使用从 AD 导出的 csv 文件并对其进行迭代,但它不是最佳的,因为那里'每次添加或删除组时,都要手动记住和导出 csv 文件。我仍然相当确定这与某些权限或类似情况有关,我只是没有时间调查它彻底的呢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2010-11-25
  • 2011-12-14
  • 1970-01-01
  • 2012-04-25
  • 2014-12-15
  • 1970-01-01
相关资源
最近更新 更多