У меня проблемы со списком всех принтеров на компьютере с помощью Powershell.
У нас есть пакетный скрипт, который добавит / удалит / выведет список принтеров «на компьютер» с помощью PrintUI.
Я могу использовать PrintUI для вывода списка принтеров.
rundll32 printui.dll,PrintUIEntry /ge /c"%UNC-NAME%"
Здесь будут перечислены только принтеры для каждого компьютера, а ...
Get-WMIObject -Class Win32_Printer -ComputerName $ComputerName
отобразит все принтеры в WMI.
В приведенном выше примере у меня есть система с 3 принтерами, когда пользователь входит в систему. WMI видит 2 из них, PrintUI видит 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
По какой-то странной причине эти команды не могут видеть принтеры, сопоставленные в контексте пользователя. Как показано в другом вопросе, следующий код будет сканировать реестр для всех учетных записей пользователей и всех принтеров списка для всех пользователей.
Список всех принтеров для всех пользователей.
ПРИМЕЧАНИЕ: Требуется WinRM
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