Powershell 列出远程 PC 上的网络打印机

Posted

技术标签:

【中文标题】Powershell 列出远程 PC 上的网络打印机【英文标题】:Powershell List Network Printers on Remote PC 【发布时间】:2016-12-16 15:05:53 【问题描述】:

我正在尝试对 GPO 进行故障排除以部署打印机,并且我需要查看当前登录用户在远程计算机上的网络打印机。当我这样做时

Get-WMIObject Win32_Printer -ComputerName PCNAME

我得到一个本地安装的打印机列表,当我尝试这个时

  Get-WMIObject Win32_Printer -ComputerName PCNAME | where$_.Name -like “*\\*” | select sharename,name

我什么也得不到。有什么帮助吗?我使用的是 PowerShell 4.0,所以 Get-Printer 不起作用。

【问题讨论】:

问题是您正在运行的用户上下文,因为网络打印机是每个用户的。我相信您运行的 wmi cmdlet 将在远程机器上的系统上下文中运行。 Get-Printer 在 PowerShell 4 中也可用,但需要 Win8 或更高版本,但同样会遇到此问题。我过去看到的这个问题的解决方案已经拉取了用户注册表的信息。 如果它作为 GPO 中的当前用户运行,为什么要指定 -computername?您的 where 过滤器逻辑看起来不在此范围内。 您是在生产环境还是测试环境中解决此问题?如果您在测试中,您始终可以使用应该映射打印机的用户帐户执行命令,如果您在 PROD 中使用实时用户帐户执行此操作,那实际上是不可能的。 我在生产环境中进行故障排除。在我的测试环境中,每台计算机都可以部署打印机。 登录用户的SID,然后从HKEY_USERS\SID\Printers\Connections 获取已安装的打印机。在我的生产环境中工作就像一个魅力。当然,您可以远程执行此操作,甚至无需启用WinRM。 @Matt 我相信 GPO 安装打印机,OP 使用脚本远程对其进行故障排除。 【参考方案1】:

我在另一个线程中大量借鉴了 tukan 的代码(感谢...该代码弥补了我尚未能够弥补的差距)并将其修改为我的目的。

以下代码确定指定远程计算机上的登录用户,然后输出该用户在注册表中 HKU\Printers\Connections 下列出的打印机。

作为奖励,我添加了几行额外的行来输出用户当前选择的默认打印机。

#- BEGIN FUNCTION -------------------------------------------------------------------------------------------------
Function remote_registry_query($target, $key)

   Try 
        $registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("Users", $target)
        ForEach ($sub in $registry.OpenSubKey($key).GetSubKeyNames())
        
            #This is really the list of printers
            write-output $sub
        

   Catch [System.Security.SecurityException] 
        "Registry - access denied $($key)"
   Catch 
        $_.Exception.Message
  

#- END FUNCTION ---------------------------------------------------------------------------------------------------


##############################
# EXECUTION STARTS HERE
##############################

# Prep variables and get information for the function call


# set the computer name
$computer = "computer_name"


# get the logged-in user of the specified computer
$user = Get-WmiObject –ComputerName $computer –Class Win32_ComputerSystem | Select-Object UserName
$UserName = $user.UserName
write-output " "
write-output " "
write-output "Logged-in user is $UserName"
write-output " "
write-output " "
write-output "Printers are:"
write-output " "

# get that user's AD object
$AdObj = New-Object System.Security.Principal.NTAccount($user.UserName)

# get the SID for the user's AD Object 
$strSID = $AdObj.Translate([System.Security.Principal.SecurityIdentifier])

#remote_registry_query -target $computer -key $root_key
$root_key = "$strSID\\Printers\\Connections"
remote_registry_query -target $computer -key $root_key

# get a handle to the "USERS" hive on the computer
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("Users", $Computer)
$regKey = $reg.OpenSubKey("$strSID\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows")

# read and show the new value from the Registry for verification
$regValue = $regKey.GetValue("Device")
write-output " "
write-output " "
write-output "Default printer is $regValue"
write-output " "
write-output " "
[void](Read-Host 'Press Enter to continue…')

【讨论】:

以上是关于Powershell 列出远程 PC 上的网络打印机的主要内容,如果未能解决你的问题,请参考以下文章

Powershell - 运行位于远程机器上的脚本,该脚本反过来从网络共享访问文件

如何列出网络上的所有打印机?

在 powershell ssh 会话中访问 Windows 网络驱动器

Java - 列出 LAN 上的所有网络打印机

Powershell - 删除除最高数字之外的所有内容

列出可用的网络打印机(也未安装)[重复]