You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:54:01