VBS操作Active Directory读取计算机账户cn属性返回空值问题求助
VBS脚本AD属性读取错误排查与修复
核心错误原因
cn属性为空的问题,是脚本中3个明确的语法/逻辑错误被全局错误屏蔽语句隐藏导致的:
- 全局错误屏蔽吞噬异常:脚本首行的
On Error Resume Next会跳过所有运行时错误,所有执行异常都被直接忽略,自然无法定位问题。 - 变量声明语法错误:VBScript不支持
string strmessage这种强类型声明写法,所有变量只能通过Dim声明,这行语法错误被屏蔽后,后续变量赋值逻辑全部异常。 - 非对象属性错误使用
Set赋值:cn是AD计算机对象的字符串属性,不是COM对象,Set关键字仅用于给对象变量赋值,这里加Set会触发类型不匹配错误,被屏蔽后valuename就为空值。
修复后的完整代码
' 调试阶段建议先注释掉On Error Resume Next,方便查看报错 ' On Error Resume Next Const ADS_SCOPE_SUBTREE = 2 Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 3000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE ' 优化:直接在查询中返回cn,无需后续二次请求AD,提升效率 objCommand.CommandText ="SELECT AdsPath, cn FROM 'LDAP://OU=Temp,OU=MAC,OU=Clients,OU=TEST Device Accounts,DC=TEST,DC=TEST,DC=TEST' WHERE objectCategory='computer'" Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst Do Until objRecordSet.EOF Dim valuename, strmessage, strUserPath, objEntry ' 直接从记录集读取cn属性 valuename = objRecordSet.Fields("cn").Value strmessage = "The computer name is :"&valuename wscript.Echo strmessage ' 写入描述字段 strUserPath = objRecordSet.Fields("AdsPath").Value set objEntry=GetObject(strUserPath) objEntry.Description = strmessage objEntry.SetInfo objRecordSet.MoveNext Loop
额外验证项
如果修复后仍然无法读取属性,确认运行脚本的账号拥有对应OU计算机对象的读取、修改权限即可。
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

