我遇到了一些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
部分,它就会冻结并崩溃。
答案 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
这里有多个问题:
objRecordset
,而不是obj.Recordset
。所以这应该是:
Debug.Print objRecordset.Fields("adspath").Value
Debug.Print objRecordset.Fields("distinguishedname").Value
Debug.Print objRecordset.Fields("sAMAccountName").Value
在其余代码中也将obj.Recordset
替换为objRecordset
。