vba 通过ip查计算机名,来自AD的Excel VBA LDAP查询网络打印机不显示端口名称

1.问题:数据类型

你的代码是不能工作的几个原因:

的PORTNAME字段存储为DataTypeEnum 12(自动化变体:DBTYPE_VARIANT)

DBTYPE_VARIANT不支持与ADO一起使用(source)。

CopyFromRecordset具有已知数据类型的问题(source)

注:所有其他字段被存储为DataTypeEnum 202(空终止的Unicode字符串)。

2.解决方案

您需要通过记录迭代并导入到PORTNAME一个字符串,然后写一个字符串到正确的单元格。这确保VBA处理转换,而不是尝试确定(in)正确数据类型的CopyFromRecordset。如果您想通过有限的修改来保留原始代码,我在下面提供了一个简单的示例。

我能够在我的机器上复制您的问题;以下修改后的代码按预期工作并包含IP。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值