从Active Directory扫描本地管理员账户脚本故障求助
解决Active Directory扫描与本地管理员组检查脚本的故障
我来帮你搞定这个脚本的问题——你遇到的报错大概率是几个基础的语法和逻辑问题导致的,咱们一步步梳理修正:
问题根源分析
你脚本里的几个关键错误点:
- 错误的脚本块定义:
$root用了{}包裹查询,这会让它变成一个未执行的脚本块对象,而不是实际的计算机列表,后续循环时$server根本不是你要的计算机名称。 - 中文引号:代码里用了中文的
”和““,PowerShell只识别英文双引号",这会直接导致语法解析失败,尤其是$computer.psbase.children.find(”Administrators”)`这行。 - 未正确提取计算机名称:用
Select -Property Name后得到的是带Name属性的对象,直接"$server"会输出类似@{Name=Win10-PC01}的字符串,导致ADSI路径错误。 - 重复AD查询:两次调用
Get-ADComputer完全可以合并,提升执行效率。
修正后的完整脚本
################################################ # 扫描Active Directory中的Win10和Win7计算机,检查本地管理员组 ################################################ # 合并AD查询,一次性获取符合条件的计算机(提取Name属性值) $computers = Get-ADComputer -Filter {Name -like "win10*" -or Name -like "*win7"} | Select-Object -ExpandProperty Name foreach ($computerName in $computers) { try { # 创建ADSI计算机对象(注意用英文引号) $computer = [ADSI]"WinNT://$computerName,computer" # 获取本地Administrators组(英文引号) $adminGroup = $computer.psbase.Children.Find("Administrators") # 获取组成员并格式化输出 $members = $adminGroup.psbase.Invoke("Members") | ForEach-Object { $adspath = $_.GetType().InvokeMember("Adspath", 'GetProperty', $null, $_, $null) # 处理不同格式的Adspath,统一输出格式 switch -Wildcard ($adspath) { "WinNT://*/*/$computerName" { $adspath -replace "WinNT://.*?/$computerName/", "" } "WinNT://*/*" { $adspath -replace "WinNT://", "" -replace "/", "\" } default { $adspath -replace "WinNT://", "" } } } # 输出结果,标注所属计算机 Write-Host "=== 计算机 $computerName 的本地管理员成员 ===" $members Write-Host "`n" } catch { # 捕获错误并提示,避免脚本中断 Write-Warning "无法访问计算机 $computerName 或获取管理员组:$_" } }
关键修改说明
- 合并AD查询并提取名称:用
-ExpandProperty Name直接获取计算机名称字符串,避免后续处理对象属性的麻烦,同时合并Filter减少AD查询次数。 - 替换所有中文引号:把所有中文引号换成英文双引号,确保PowerShell能正确解析。
- 添加错误处理:用
try/catch包裹核心逻辑,遇到无法访问的计算机(比如离线、权限不足)时会输出警告,脚本继续运行。 - 优化成员格式化:用
switch处理不同格式的Adspath,输出更清晰的成员名称(比如域用户显示DOMAIN\Username,本地用户显示Username)。
内容的提问来源于stack exchange,提问作者rogerwilcolta
相关产品推荐
相关产品推荐

