来自AD的Excel VBA LDAP查询网络打印机不显示端口名
我想使用下面的代码将我的域中的所有网络打印机快速添加到Excel电子表格中,以用于我的记录。除了端口名(IP地址)未显示(单元格为空)之外,代码工作正常 有人能看一下我下面的代码并指出它为什么不适用于PortName字段吗来自AD的Excel VBA LDAP查询网络打印机不显示端口名,vba,excel,active-directory,ldap-query,network-printers,Vba,Excel,Active Directory,Ldap Query,Network Printers,我想使用下面的代码将我的域中的所有网络打印机快速添加到Excel电子表格中,以用于我的记录。除了端口名(IP地址)未显示(单元格为空)之外,代码工作正常 有人能看一下我下面的代码并指出它为什么不适用于PortName字段吗 Private Sub GetAllPrintersFromAD() Const ADS_SCOPE_SUBTREE = 2 Set objRoot = GetObject("LDAP://rootDSE") strDomain = objRoot.G
Private Sub GetAllPrintersFromAD()
Const ADS_SCOPE_SUBTREE = 2
Set objRoot = GetObject("LDAP://rootDSE")
strDomain = objRoot.Get("defaultNamingContext")
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
"SELECT distinguishedName,portName,location,servername FROM 'LDAP://" & strDomain & "' WHERE objectClass='printQueue'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
ActiveSheet.Range("A2").CopyFromRecordset objRecordSet
objRecordSet.Close
objConnection.Close
End Sub
我使用这个旧脚本将相同的数据写入
.csv
文件。对我有好处。试试看
'Query AD for Printer details form printer name
ReportLog = "OutPut.csv"
Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim objOut : Set objOut = objFSO.CreateTextFile(ReportLog)
objOut.WriteLine "Dis Name;printer name;port name;Location;Server name;"
Set objRootDSE = GetObject("LDAP://rootDSE")
strADsPath = "<LDAP://" & objRootDSE.Get("defaultNamingContext") & ">"
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOOBject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
strFilter = "(&(objectClass=printQueue))"
strAttributes = "distinguishedName,printShareName,portName,location,servername"
strQuery = strADsPath & ";" & strFilter & ";" & strAttributes & ";subtree"
objCommand.CommandText = strQuery
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 300
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
'objRecordSet.MoveFirst
Do Until objRecordSet.EOF
strDN = "<ERROR>"
strPSN = "<ERROR>"
strPN = "<ERROR>"
strLO = "<ERROR>"
strSN = "<ERROR>"
On Error Resume Next
strDN = objRecordSet.Fields("distinguishedName")
strPSN = objRecordSet.Fields("printShareName")
strPN = objRecordSet.Fields("portName")
strLO = objRecordSet.Fields("location")
strSN = objRecordSet.Fields("serverName")
Err.Clear
On Error GoTo 0
objOut.WriteLine """" & strDN & """;""" & Join(strPSN, ";") & """;""" & Join(strPN, ";") & """;""" & strLO & """;""" & strSN & """"
objRecordSet.MoveNext
Loop
'Next
objOut.Close
WScript.Echo "Finished"
“从打印机名称查询打印机详细信息”
ReportLog=“OutPut.csv”
Dim objFSO:Set objFSO=CreateObject(“Scripting.FileSystemObject”)
Dim objOut:Set objOut=objFSO.CreateTextFile(ReportLog)
objOut.WriteLine“Dis名称;打印机名称;端口名称;位置;服务器名称
设置objRootDSE=GetObject(“LDAP://rootDSE”)
斯特拉斯帕特=“”
设置objConnection=CreateObject(“ADODB.Connection”)
设置objCommand=CreateObject(“ADODB.Command”)
objConnection.Provider=“ADsDSOOBject”
objConnection.打开“Active Directory提供程序”
设置objCommand.ActiveConnection=objConnection
strFilter=“(&(objectClass=printQueue))”
StratAttributes=“DifferentiedName、printShareName、portName、location、servername”
strQuery=strADsPath&“;”&strFilter&“;”&strAttributes&“子树”
objCommand.CommandText=strQuery
objCommand.Properties(“页面大小”)=1000
objCommand.Properties(“超时”)=300
objCommand.Properties(“缓存结果”)=False
Set objRecordSet=objCommand.Execute
'objRecordSet.MoveFirst
直到objRecordSet.EOF为止
strnd=“”
strPSN=“”
strPN=“”
strLO=“”
strSN=“”
出错时继续下一步
strnd=objRecordSet.Fields(“区分名称”)
strPSN=objRecordSet.Fields(“printShareName”)
strPN=objRecordSet.Fields(“端口名”)
strLO=objRecordSet.Fields(“位置”)
strSN=objRecordSet.Fields(“服务器名”)
呃,明白了
错误转到0
objOut.WriteLine“”&strnd&“;”&Join(strPSN,“;”&“;”&Join(strPN,“;”&“;”&strLO&“;”&strSN&“)
objRecordSet.MoveNext
环
”“接着呢
目标关闭
Echo“已完成”
输出为:
1。问题:数据类型 由于以下几个原因,您的代码无法工作:
- portName字段存储为DataTypeEnum 12(自动化变量:DBTYPE\U Variant)
- DBTYPE_变量不支持与ADO()一起使用
- CopyFromRecordset存在已知的数据类型问题()
Private Sub GetAllPrintersFromAD()
Const ADS_SCOPE_SUBTREE = 2
Set objRoot = GetObject("LDAP://rootDSE")
strDomain = objRoot.Get("defaultNamingContext")
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
"SELECT distinguishedName,portName,location,servername FROM 'LDAP://" & strDomain & "' WHERE objectClass='printQueue'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
ActiveSheet.Range("A2").CopyFromRecordset objRecordSet
'Copy over the portName field properly
objRecordSet.MoveFirst
i = 2
Do Until objRecordSet.EOF
strportname = vbNullString
On Error Resume Next
strportname = objRecordSet.Fields("portName")
Err.Clear
On Error GoTo 0
ActiveSheet.Range("B" & i).Value2 = strportname
i = i + 1
objRecordSet.MoveNext
Loop
objRecordSet.Close
objConnection.Close
End Sub