Вопрос или проблема
Я использую это, чтобы попытаться получить список принтеров на удаленном компьютере:
Get-WmiObject win32_printer -ComputerName "$oldPcName"
Проблема в том, что я получаю только локальные принтеры, а не те, что находятся на сервере печати, подключенном к компьютеру. Как я могу получить список сетевых принтеров?
Моя цель — получить список сетевых принтеров на удаленном компьютере, удалить их и добавить другие принтеры с другого сервера печати.
На Windows 7
Чтобы увидеть сетевые принтеры, я просмотрел реестр
Function InstalledPrinters ($ComputerName)
{
Invoke-Command -ComputerName $ComputerName -ScriptBlock {
$InstalledPrinters = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Connections"
$InstalledPrinters | Add-Member -Name 'PrinterName' -MemberType NoteProperty -Value ""
Foreach ($InstalledPrinter in $InstalledPrinters) {$InstalledPrinter.PrinterName = $InstalledPrinter.GetValue("Printer").split("\")[3]}
Return $InstalledPrinters | sort PrinterName | select PSComputerName, PrinterName
}
}
Чтобы удалить сетевой принтер:
rundll32.exe PRINTUI.DLL PrintUIEntry /gd /c\\$ComputerName /n\\$PrintServer\$PrinterName Gw /q
Чтобы установить сетевой принтер:
rundll32.exe PRINTUI.DLL PrintUIEntry /ga /c\\$ComputerName /n\\$PrintServer\$PrinterName Gw /q
Этот старый вопрос был поднят ботом сообщества – Реальный ответ состоит в том, что большинство сетевых принтеров (либо подключенные через сервер печати, либо общие с другим компьютером) настроены на уровне учетной записи пользователя, а не для всего устройства.
Powershell может подключаться различными способами, такими как удаленное управление PS или WMI, но он всегда будет выполняться от вашего имени по умолчанию. Это означает, что когда вы или ваш сценарий подключаетесь как администратор, вы увидите только подключенные принтеры этой учетной записи.
Чтобы удалить сетевые принтеры пользователя, вы должны запустить свой сценарий от затронутого пользователя. Некоторые варианты для этого:
- Групповая политика: Раздел Конфигурация пользователя > Параметры > Параметры панели управления > Принтеры
- Удаленные инструменты управления, такие как SCCM или Intune, которые могут работать в контексте пользователя
- Сценарии входа пользователя
Единственный способ обойти это — гораздо более сложный процесс загрузки реестра другого пользователя
#--------------------------
#Установить выполнение PSScripts
#--------------------------
Set-ExecutionPolicy Unrestricted -force
#------------
#Выключить UAC
#------------
New-ItemProperty -Path HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system -Name EnableLUA -PropertyType DWord -Value 0 -Force
#------------------------------
#Введите имя компьютера
#------------------------------
$comp = "Имя компьютера"
#или если вы хотите, чтобы запрашивалось имя компьютера
$comp = Read-host 'Введите имя компьютера?'
#---------------------------------------
#Запускает службу WinRM на удаленном компьютере
#---------------------------------------
Import-Module Remote_PSRemoting -force
Set-WinRMListener -computername $comp
Restart-WinRM -computername $comp
Set-WinRMStartUp -computername $comp
Start-Sleep -Seconds 60
#----------------------------------------------
#Установите PSSession с удаленным компьютером
#----------------------------------------------
New-PSSession $comp | Enter-PSSession
#Все команды замены используются для удаления лишних символов и просто #возвращают путь \\server\printer
#-----------------------
#Получает список принтеров
#-----------------------
$printers1 = Get-childitem -Path HKCU:\printers\connections | select name
$printers2 = $printers1 -replace '.*,,'
$printers3 = $printers2 -replace ',','\'
$printers = $printers3 -replace '}', ''
------------------------------------------------------
#Чтобы заменить старое имя сервера печати на новое
------------------------------------------------------
$newprinters = $printers -replace 'oldserver','\\newserver'
#--------------------
#Получает принтер по умолчанию
#--------------------
$default = Get-itemproperty -Path "HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows" | select device
$default1 = $default -replace '.*='
$default2 = $default1 -replace '()'
$default3 = $default2 -replace ',winspool'
$defaultprinter = $default3 -replace ',.*'
------------------------------------------------------
#Чтобы заменить старое имя сервера печати на новое
------------------------------------------------------
$newdefaultprinter = $defaultprinter -replace 'oldserver','\\newserver'
#------------------------
#Удаляет старые принтеры
#------------------------
Get-WMIObject Win32_Printer | where{$_.Network -eq 'true'} | foreach{$_.delete()}
#----------------------------------------
#Выходит из PSSession с удаленным компьютером
#----------------------------------------
Exit-PSSession
#-----------
#Включить UAC
#-----------
#Значение = 0 до 4 в зависимости от уровня UAC
New-ItemProperty -Path HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system -Name ConsentPromptBehaviorAdmin -PropertyType DWord -Value 2 -Force
#------------------------------------
#Выключить политику выполнения сценариев
#------------------------------------
Set-ExecutionPolicy undefined -Force
#####На этом я смог продвинуться. Я всегда отключаю UAC и включаю сценарии в начале и включаю их обратно в конце. Резюме этого сценария даст вам новые пути сетевых принтеров и принтеры по умолчанию пользователя. Он также удаляет старые сетевые принтеры пользователя. С версиями powershell до Windows 8 и сервера 2012, вам нужно было создать сценарий входа, чтобы добавить новые принтеры и установить принтер по умолчанию с использованием команд WMI. Вы также можете использовать файл csv со списком имен компьютеров в качестве ввода, если хотите выполнить эту команду на нескольких компьютерах. Это будет выглядеть как...
$csv = Import-csv -Path pathofcsvfile
foreach ($line in $csv) {
#С помощью скобки в конце для выполнения для каждого компьютера в списке...
С более новыми версиями Windows это все намного проще, так как у них есть cmdlet Get-printers
…
Надеюсь, это поможет вам начать… Я был бы рад увидеть, как кто-то завершит этот сценарий, так как у меня не было времени на работе сделать это…
.
Ответ или решение
Для того чтобы получить список сетевых принтеров на удаленном компьютере, необходимо учитывать, что большинство сетевых принтеров, подключенных через сервер печати или совместно используемые другими компьютерами, регистрируются на уровне сеанса пользователя, а не на уровне всего устройства. Это означает, что доступ к этому списку с помощью PowerShell или других инструментов управления может быть ограничен. Давайте разберем несколько подходов для получения этой информации, а также для удаления и установки новых принтеров.
1. Использование PowerShell с вызовом к реестру
Если ваш сценарий работает с Windows 7, вы можете воспользоваться реестром для получения списка подключенных сетевых принтеров:
Function InstalledPrinters ($ComputerName)
{
Invoke-Command -ComputerName $ComputerName -ScriptBlock {
$InstalledPrinters = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Connections"
$InstalledPrinters | Add-Member -Name 'PrinterName' -MemberType NoteProperty -Value ""
Foreach ($InstalledPrinter in $InstalledPrinters) {
$InstalledPrinter.PrinterName = $InstalledPrinter.GetValue("Printer").split("\")[3]
}
Return $InstalledPrinters | sort PrinterName | select PSComputerName, PrinterName
}
}
Данный код поможет получить список принтеров, установленных на удаленном компьютере.
2. Удаление сетевого принтера
Для удаления сетевого принтера можно использовать следующую команду:
rundll32.exe PRINTUI.DLL PrintUIEntry /gd /c\\$ComputerName /n\\$PrintServer\$PrinterName Gw /q
Здесь $ComputerName
— имя удаленного компьютера, а $PrintServer
и $PrinterName
представляют имя сервера печати и имя конкретного принтера.
3. Установка сетевого принтера
Чтобы установить новый принтер в сеть, используйте следующую команду:
rundll32.exe PRINTUI.DLL PrintUIEntry /ga /c\\$ComputerName /n\\$PrintServer\$PrinterName Gw /q
Эти команды обеспечивают гибкость в управлении сетевыми принтерами на удаленных машинах.
4. Контекст пользователя
Важно учитывать, что все операции, связанные с получением списка подключенных принтеров и удалением/установкой новых, требуют выполнения под контекстом пользователя, которому принадлежат эти принтеры. Это можно реализовать несколькими способами:
- ИспользованиеПолитик Группы: путь "Конфигурация пользователя" > "Настройки управления" > "Принтеры".
- Применение инструментов удаленного управления, таких как SCCM или Intune, которые могут выполнять скрипты от имени пользователя.
- Написание сценариев, исполняемых в момент входа пользователя в систему.
Заключение
Для решения задачи по получению списка и управлению сетевыми принтерами на удаленном компьютере, необходимо использовать комбинацию PowerShell и манипуляций с реестром. Учтите, что удобство работы с сетевыми принтерами в конечном итоге зависит от контекста пользователя, что требует грамотного подхода к административным задачам. Такой подход позволит эффективно управлять сетевыми устройствами, минимизировать количество ошибок и повысить общую производительность работы с принтерами в вашей сети.