从VBA

时间:2016-08-29 11:48:36

标签: excel vba ms-word active-directory

我遇到了一些VBA编程问题,因为我对它很陌生。 我已经被赋予了在Word / excel中创建一个宏/ vba应用程序的任务,该应用程序检索姓氏,名字。电话号码|部门| Active Directory中的管理器。 所以我在最后几天一直在网上搜索,但没有什么对我有用。 获取当前用户名/姓,电子邮件等的模板可供使用。我很难将代码转移到我现在需要做的事情上。 所以我过去几个小时一直在尝试的是获取Active Directory中所有用户的列表。但我使用的代码来自我在互联网上找到的VBScript。我改变了我可以使其与VBA一起工作但我在尝试运行它时总是遇到错误。 代码如下:

    Sub test()
' get OU
'

strOU = "OU=Users,DC=domain,DC=com"

' connect to active directory
'

Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"

' create command
'

Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000

' execute command to get all users
'

objCommand.commandtext = "LDAP://" & strOU & ">;" & _
  "(&(objectclass=user)(objectcategory=person));" & _
  "adspath,distinguishedname,sAMAccountName;subtree"

On Error Resume Next
Set objRecordSet = objCommand.Execute
If Err.Number <> 0 Then MsgBox "Exception occured: " & Err.Description
On Error GoTo 0

'Dim RecordSet As New ADODB.RecordSet
Set objRecordSet = objCommand.Execute

'Show info for each user in OU
'

Do Until objRecordSet.EOF

  'Show required info for a user
  '

  Debug.Print obj.RecordSet.Fields(“adspath”).Value
  Debug.Print obj.RecordSet.Fields(“distinguishedname”).Value
  Debug.Print obj.RecordSet.Fields(“sAMAccountName”).Value

  ' Move to the next user
  '

  obj.RecordSet.MoveNext

Loop

' Clean up
'

obj.RecordSet.Close

Set obj.RecordSet = Nothing
Set objCommand = Nothing

objConnection.Close
Set objConnection = Nothing

End Sub

并且在这一行中它每次都停止:

Set objRecordSet = objCommand.Execute

如果我删除了If Err.Number <> 0 Then MsgBox "Exception occured: " & Err.Description On Error GoTo 0部分,它就会冻结并崩溃。

1 个答案:

答案 0 :(得分:0)

好的,让我们自上而下:

strOU = "OU=Users,DC=domain,DC=com"

有了这个,没有人可以帮助你。您必须知道AD的AD结构。如果这是错误的,那么你得到&#34;表未找到&#34;来自LDAP。

objCommand.commandtext = "LDAP://" & strOU & ">;" & _
  "(&(objectclass=user)(objectcategory=person));" & _
  "adspath,distinguishedname,sAMAccountName;subtree"

缺少<。它应该是:

objCommand.commandtext = "<LDAP://" & strOU & ">;" & _
  "(&(objectclass=user)(objectcategory=person));" & _
  "adspath,distinguishedname,sAMAccountName;subtree"

然后

  Debug.Print obj.RecordSet.Fields(“adspath”).Value
  Debug.Print obj.RecordSet.Fields(“distinguishedname”).Value
  Debug.Print obj.RecordSet.Fields(“sAMAccountName”).Value

这里有多个问题:

  1. 在VBA源代码中,不允许使用排版双引号作为字符串分隔符。
  2. 您的对象的名称为objRecordset,而不是obj.Recordset
  3. 所以这应该是:

      Debug.Print objRecordset.Fields("adspath").Value
      Debug.Print objRecordset.Fields("distinguishedname").Value
      Debug.Print objRecordset.Fields("sAMAccountName").Value
    

    在其余代码中也将obj.Recordset替换为objRecordset