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

PowerShell从计算机列表获取打印机驱动并导出CSV失败求助

解决PowerShell获取远程打印机驱动并导出CSV的问题

嘿,我明白你折腾了好几种脚本写法都卡在导出CSV这一步的郁闷劲儿。咱们先把核心问题拆解清楚,然后给你一个能稳定工作的修正版脚本,顺便说说你之前可能踩的坑。

常见问题排查

先说说你之前可能遇到的隐形障碍:

  • 权限不足:读取远程计算机的打印机驱动需要你运行脚本的账户拥有目标机器的本地管理员权限,否则会直接被拒绝访问。
  • 远程连接问题:目标机器可能没开WMI服务(Winmgmt),或者防火墙挡住了WMI请求(域环境默认允许,工作组环境得手动配置规则)。
  • 结果收集方式错误:用@()累加数组有时候会丢失对象属性,导致导出CSV时信息不全或者格式混乱。

修正后的完整脚本

这个脚本解决了上述问题,还加入了错误处理和在线检测,能帮你清晰排查每台机器的状态:

# 加载AD模块(如果不需要AD相关操作可以直接去掉这行)
Import-Module ActiveDirectory

# 读取目标计算机列表
$computerList = Get-Content -Path 'C:\ScriptResources\computers.txt'

# 遍历计算机并收集驱动信息,直接通过管道导出CSV
$computerList | ForEach-Object {
    $computerName = $_
    
    # 先检查计算机是否在线,避免无意义的连接尝试
    if (Test-Connection -ComputerName $computerName -Count 1 -Quiet -ErrorAction SilentlyContinue) {
        try {
            # 用Get-CimInstance获取打印机驱动(比旧的Get-WmiObject更稳定)
            $drivers = Get-CimInstance -ClassName Win32_PrinterDriver -ComputerName $computerName -ErrorAction Stop
            
            # 给每条驱动添加上计算机名,方便CSV里区分来源
            $drivers | Select-Object `
                @{Name='ComputerName'; Expression={$computerName}},
                Name,
                Version,
                Manufacturer,
                DriverPath
        }
        catch {
            # 捕获错误并记录到结果中
            Write-Warning "获取 $computerName 驱动失败:$($_.Exception.Message)"
            [PSCustomObject]@{
                ComputerName = $computerName
                Name = "获取失败"
                Version = $_.Exception.Message
                Manufacturer = ""
                DriverPath = ""
            }
        }
    }
    else {
        Write-Warning "计算机 $computerName 无法访问"
        [PSCustomObject]@{
            ComputerName = $computerName
            Name = "无法访问"
            Version = ""
            Manufacturer = ""
            DriverPath = ""
        }
    }
} | Export-Csv -Path 'C:\ScriptResources\PrinterDrivers.csv' -NoTypeInformation -Encoding UTF8

关键改进点说明

  • 在线检测:用Test-Connection先确认机器能ping通,减少无效的WMI请求。
  • CIM替代WMI:Get-CimInstance是PowerShell的现代远程管理命令,兼容性更好,错误处理更灵活。
  • 自定义属性:通过Select-Object添加ComputerName字段,解决了导出后不知道驱动属于哪台机器的问题。
  • 错误处理:不管是机器无法访问还是权限不足,都会把错误信息写入CSV,方便后续排查。
  • 直接管道导出:避免手动累加数组导致的属性丢失,同时更节省内存。
  • 编码设置:指定-Encoding UTF8防止中文驱动名或厂商名乱码,-NoTypeInformation去掉CSV开头的冗余类型信息。

额外提示

  • 如果是工作组环境,需要在Get-CimInstance里加上-Credential参数指定目标机器的管理员账户。
  • 可以先在单台机器上测试Get-CimInstance -ClassName Win32_PrinterDriver -ComputerName "目标机器名",确认能正常返回结果再跑批量脚本。

内容的提问来源于stack exchange,提问作者fausty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:47:53