我在使用 Powershell 列出计算机上的所有打印机时遇到问题。
我们有一个批处理脚本,可以使用 PrintUI 添加/删除/列出“每台计算机”的打印机。
我可以使用 PrintUI 列出打印机。
rundll32 printui.dll,PrintUIEntry /ge /c"%UNC-NAME%"
这将仅列出每台计算机的打印机,而...
Get-WMIObject -Class Win32_Printer -ComputerName $ComputerName
将列出 WMI 中的所有打印机。
在上面的例子中,我的系统有 3 台打印机,当用户登录时。WMI 看到其中的 2 台,PrintUI 看到 1 台。
我不知道如何才能列出所有这些!这样我就可以编写脚本来审核/添加/删除“每台计算机”和“本地”打印机
答案1
获取共享打印机
Get-Printer -ComputerName pc| where Shared -eq $true | fl Name
获取未共享的打印机
Get-Printer -ComputerName pc | where Shared -eq $false | fl Name
获取映射打印机
Get-WMIObject Win32_Printer -ComputerName $env:COMPUTERNAME | where{$_.Name -like “*\\*”} | select sharename,name
获取所有打印机
Get-WMIObject Win32_Printer -ComputerName $env:COMPUTERNAME
答案2
由于某些奇怪的原因,这些命令无法看到每个用户上下文中映射的打印机。正如在另一个问题中发现的那样,以下代码将扫描注册表以查找所有用户帐户并列出所有用户的打印机。
列出所有用户的所有打印机。
注意:需要温控器
param (
[string]$Comp = "localhost"
)
function ListAllPrinters {
param (
[string]$Comp
)
Invoke-Command -ComputerName $Comp -ScriptBlock {
Get-ChildItem Registry::\HKEY_Users |
Where-Object { $_.PSChildName -NotMatch ".DEFAULT|S-1-5-18|S-1-5-19|S-1-5-20|_Classes" } |
Select-Object -ExpandProperty PSChildName |
ForEach-Object { Get-ChildItem Registry::\HKEY_Users\$_\Printers\Connections -Recurse | Select-Object -ExpandProperty Name }
}
}
# Main
ListAllPrinters $Comp