Power shell добавить локальный принтер windows

/ /

1

29.09.2023, 11:34. Показов 1185. Ответов 11


Author24 — интернет-сервис помощи студентам

/ /

29.09.2023, 11:57

2

Добавлено через 2 минуты
Alexnet84,
данный вопрос можно назвать иначе: ‘Погуглите кто-нибудь вместо меня, самому мне лень’

/ /

29.09.2023, 12:20

 [ТС]

3

/ /

29.09.2023, 13:42

4

Цитата
Сообщение от Alexnet84
Посмотреть сообщение

А если не копировать решение буквально?

Цитата
Сообщение от Alexnet84
Посмотреть сообщение

PortName : HPLaserJetMFPMdn

/ /

29.09.2023, 20:25

5

а я думал, он так пошутил.

ведь ты же пошутил, да, Alexnet84 ?
пошутил ?

/ /

02.10.2023, 14:37

 [ТС]

6

/ /

02.10.2023, 19:09

7

Цитата
Сообщение от Alexnet84
Посмотреть сообщение

Это список свойств объекта, который создал Get-Printer
Ну а самому сложить 2+2?

PowerShell
1
2
  GetPrinter.PortName
GetPrinterPort     printerhostaddress

/ /

02.10.2023, 21:13

8

Цитата
Сообщение от lesser
Посмотреть сообщение

Это список свойств объекта, который создал Get-Printer

/ /

02.10.2023, 21:34

9

Цитата
Сообщение от YuS_2
Посмотреть сообщение

Проблема в том

У меня нет сетевого принтера, соответственно и проблемы. Я исхожу из данных Alexnet84

/ /

02.10.2023, 22:08

10

Цитата
Сообщение от lesser
Посмотреть сообщение

У меня нет сетевого принтера

/ /

03.10.2023, 08:38

11

Цитата
Сообщение от YuS_2
Посмотреть сообщение

Узнать адрес сетевого принтера через Get-Printer

/ /

04.10.2023, 17:16

 [ТС]

12

есть команда (желательно одной строчкой), которая покажет список:
сетевой (с IP адресом) и локальный принтер.

/ /

04.10.2023, 17:16

Помогаю со студенческими работами здесь

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

First of all I am not really into scripting. So I am sorry if I may ask a “stupid” question or likewise things.

function Get-UserNetPrinter {
    <#
        .SYNOPSIS
            Get all the Network Printers from the Registry
            Requires Remote Registry access on the remote machine
 
        .DESCRIPTION
            Extract a list of all Print-Server Printers that a computer is using.
            These are not the same as direct install printers. For that, WMI is easier
 
 
        .PARAMETER ComputerName
            A computer or array of computers
 
        .EXAMPLE
            Get-UserNetPrinter $(hostname)
 
        DESCRIPTION
        ------------
            Get all the installed printers on the current machine
 
 
        OUTPUT
        ------------
            Returns Computer Printer Details as an object
 
            E.g:
 
            computer         : ComputerName
            user             : Domain\User
            printServer      : PrintServerName
            printer          : PrinterName
            pringerGUID      : {ABCDE-FGH-1234-5678-ABCDEFGHI}
            printerDesc      : 
            printerDriver    : XX V123
            printerLocation  : 
            printerPortName  : 
            printerShareName : PrinterSharedName
            printerSpooling  : PrintAfterSpooled
            printerPriority  : 1
            printerUNC       : \\UNC\PATH\GOES\HERE
            printerDefault   : 
 
 
 
        .NOTES
            Author: Pessimist__Prime for Reddit
            Last-Edit-Date: 14/06/2017
 
 
            Changelog:
            14/06/2017 - Initial Script
            14/06/2017 - Adam Mnich added default printer
 
 
    #>
 
 
    [CmdletBinding()]
    PARAM(
        [Parameter(ValueFromPipelineByPropertyName = $true, Position = 0)]        
        [string[]]$computerName = $env:ComputerName
    )
    begin {
        #Return the script name when running verbose, makes it tidier
        write-verbose "===========Executing $($MyInvocation.InvocationName)==========="
        #Return the sent variables when running debug
        Write-Debug "BoundParams: $($MyInvocation.BoundParameters|Out-String)"
        $regexPrinter = "\\\\.*\\(.*)$"
        $regexPrinter2 =  "(\w*),"
        $regexPrinter3 = "\\\\.*\\(.*),winspool"
    }
 
    process {
        #Iterate through each computer passed to function
        foreach ($computer in $computerName) {
 
            write-verbose "Processing $computer"
            #Open the old remote registry
            $reglm = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.Registryhive]::LocalMachine, $computer)
            $regu = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.Registryhive]::Users, $computer)
            #Grab the USER SIDS, try and ignore service accounts and stuff
            $sids = ($regu.GetSubKeyNames() | Where-Object {($_ -notlike '*.DEFAULT*') -and ($_ -notlike "*classes*") -and ($_.length -ge 9)})
            foreach ($sid in $sids) {
                write-verbose "Processing UserSID:  $sid"
                $printersReg = $regu.OpenSubKey("$sid\printers\connections")
                $printerDefaultReg = $regu.OpenSubKey("$sid\printers\defaults")                             
                $DefaultPrinter = try {
                        ($regu.OpenSubKey("$sid\printers\defaults\$($printerDefaultReg.GetSubKeyNames())")).getvalue($null)
                    } 
                    catch {$null}
                if ($printerDefaultReg -eq $null){
                    $printerDefaultReg = $regu.OpenSubKey("$sid\Software\Microsoft\Windows NT\CurrentVersion\Windows")  
                    $DefaultPrinter = try {$printerDefaultReg.GetValue("Device")} catch {$null}
                }
                Write-Verbose "Default Printer $DefaultPrinter"
                if ($DefaultPrinter -match $regexPrinter3){
                    $DefaultPrinter = $Matches[1]
                }
                elseif ($DefaultPrinter -match $regexPrinter){
                    $DefaultPrinter = $Matches[1]
                }
                elseif ($DefaultPrinter -match $regexPrinter2){
                    $DefaultPrinter = $Matches[1]           
                }
                if (($printersReg -ne $null) -and ($printersReg.length -gt 0)) {
                    $printers = $printersReg.getsubkeynames()
                    #Try and get the username from the SID - Need to be the same domain
                    #Should change to a try-catch for different domains
                    $user = $($(New-Object System.Security.Principal.SecurityIdentifier($sid)).Translate([System.Security.Principal.NTAccount]).Value)
 
                    foreach ($printer in $printers) {
                        #Need to split the regkey name to get proper values
                        #Split 2 = Print server
                        #Split 3 = printer name
                        #Never seen a value in the 0 or 1 spots
                        $split = $printer.split(",")
                        $printerDetails = $regu.openSubKey("$SID\Printers\Connections\$printer")
                        $printerGUID = $printerDetails.getValue("GuidPrinter")
                        $spoolerPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\Servers\$($split[2])\Printers\$printerGUID\DsSpooler"
                        $printSpooler = $reglm.OpenSubKey("$spoolerPath")
 
                        #Make an object to store in the array
                        $pdetails = [pscustomobject]@{
                            computer         = $computer
                            user             = $user
                            printServer      = $split[2]
                            printer          = $split[3]
                            pringerGUID      = $printerGUID
                            printerDesc      = $($printSpooler.getValue("description"))
                            printerDriver    = $($printSpooler.getValue("DriverName"))
                            printerLocation  = $($printSpooler.getValue("Location"))
                            printerPortName  = $($printSpooler.getValue("PortName"))
                            printerShareName = $($printSpooler.getValue("printShareName"))
                            printerSpooling  = $($printSpooler.getValue("printSpooling"))
                            printerPriority  = $($printSpooler.getValue("priority"))
                            printerUNC       = $($printSpooler.getValue("uNCName"))
                            printerDefault   = if ($split[3] -eq $DefaultPrinter){$true}
                        }                       
                        #Add the object to the array
                        $pdetails
                    }
                }
                else {
                    #Well, something didn't work on this computer entry
                    #This script could do with better error handling
                    write-verbose "No Access or No Printers"
                }
            }
        }
    }
}192.168.254.254

Is there anyway to adapt this code that I get this result?

thanks for your replies! I would now like to show to you what did work for me. First I had to enable remote registry on the computers I have in my report.

Therefore I did use this script:

:/>  Process Monitor - мониторинг активности процессов | Блог по Windows

# Prompt the user to enter the path to the text file containing computer names
$computerNamesFile = Read-Host "Enter the path to the text file containing computer names"

# Check if the computer names file exists
if (Test-Path $computerNamesFile) {
    # Read computer names from the file
    $computerNames = Get-Content $computerNamesFile

    foreach ($computerName in $computerNames) {
        # Check if the remote computer is reachable through ping test
        if (Test-Connection -ComputerName $computerName -Count 1 -Quiet) {
            # Enable Remote Registry service on the remote computer
            Invoke-Command -ComputerName $computerName -ScriptBlock {
                Set-Service -Name "RemoteRegistry" -StartupType Automatic
                Start-Service -Name "RemoteRegistry"
            }
            Write-Host "Remote Registry has been enabled on $computerName."
        } else {
            Write-Host "Error: $computerName is not reachable. Skipping enabling Remote Registry."
        }
    }
} else {
    Write-Host "Error: Computer names file not found at $computerNamesFile."
}

Then I did use the script to report all the installed network printers with the same hostname report:

function Get-UserNetPrinter { 
   <#
    .SYNOPSIS
        Get all the Network Printers from the Registry
        Requires Remote Registry access on the remote machine

    .DESCRIPTION
        Extract a list of all Print-Server Printers that a computer is using.
        These are not the same as direct install printers. For that, WMI is easier

    .PARAMETER ComputerListFilePath
        Path to the file containing a list of computer names

    .PARAMETER OutputFilePath
        Path to the file where the output will be stored

    .EXAMPLE
        Get-UserNetPrinter -ComputerListFilePath "C:\path\to\computerlist.txt" -OutputFilePath "\\network\path\output.txt"

    DESCRIPTION
    ------------
        Get all the installed printers on the specified machines and store the results in the specified file

    .NOTES
        Author: Pessimist__Prime for Reddit
        Last-Edit-Date: 14/06/2017

        Changelog:
        14/06/2017 - Initial Script
        14/06/2017 - Adam Mnich added default printer

    #>

    [CmdletBinding()]
    PARAM (
        [Parameter(Position = 0, Mandatory = $true)]
        [string]$ComputerListFilePath,

        [Parameter(Position = 1, Mandatory = $true)]
        [string]$OutputFilePath
    )

    begin {
        #Return the script name when running verbose, makes it tidier
        Write-Verbose "===========Executing $($MyInvocation.InvocationName)==========="
        #Return the sent variables when running debug
        Write-Debug "BoundParams: $($MyInvocation.BoundParameters|Out-String)"
        $regexPrinter = "\\\\.*\\(.*)$"
        $regexPrinter2 = "(\w*),"
        $regexPrinter3 = "\\\\.*\\(.*),winspool"
        $results = @()
    }

    process {
        # Read computer names from the file
        $ComputerNames = Get-Content $ComputerListFilePath

        # Iterate through each computer passed to function
        foreach ($Computer in $ComputerNames) {
            if (Test-Connection -ComputerName $Computer -Count 1 -Quiet) {
                Write-Verbose "Processing $Computer"
                #Open the old remote registry
                $reglm = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.Registryhive]::LocalMachine, $Computer)
                $regu = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.Registryhive]::Users, $Computer)
                #Grab the USER SIDS, try and ignore service accounts and stuff
                $SIDs = ($regu.GetSubKeyNames() | Where-Object {($_ -notlike '*.DEFAULT*') -and ($_ -notlike "*classes*") -and ($_.length -ge 9)})
                foreach ($SID in $SIDs) {
                    Write-Verbose "Processing UserSID:  $SID"
                    $printersReg = $regu.OpenSubKey("$SID\printers\connections")
                    $printerDefaultReg = $regu.OpenSubKey("$SID\printers\defaults")
                    $DefaultPrinter = try {
                        ($regu.OpenSubKey("$SID\printers\defaults\$($printerDefaultReg.GetSubKeyNames())")).getvalue($null)
                    }
                    catch {
                        $null
                    }
                    if ($printerDefaultReg -eq $null) {
                        $printerDefaultReg = $regu.OpenSubKey("$SID\Software\Microsoft\Windows NT\CurrentVersion\Windows")
                        $DefaultPrinter = try { $printerDefaultReg.GetValue("Device") }
                        catch { $null }
                    }
                    Write-Verbose "Default Printer $DefaultPrinter"
                    if ($DefaultPrinter -match $regexPrinter3) {
                        $DefaultPrinter = $Matches[1]
                    }
                    elseif ($DefaultPrinter -match $regexPrinter) {
                        $DefaultPrinter = $Matches[1]
                    }
                    elseif ($DefaultPrinter -match $regexPrinter2) {
                        $DefaultPrinter = $Matches[1]
                    }
                    if (($printersReg -ne $null) -and ($printersReg.length -gt 0)) {
                        $printers = $printersReg.getsubkeynames()
                        #Try and get the username from the SID - Need to be the same domain
                        #Should change to a try-catch for different domains
                        $User = $($(New-Object System.Security.Principal.SecurityIdentifier($SID)).Translate([System.Security.Principal.NTAccount]).Value)

                        foreach ($Printer in $printers) {
                            #Need to split the regkey name to get proper values
                            #Split 2 = Print server
                            #Split 3 = printer name
                            #Never seen a value in the 0 or 1 spots
                            $Split = $Printer.split(",")
                            $PrinterDetails = $regu.openSubKey("$SID\Printers\Connections\$Printer")
                            $PrinterGUID = $PrinterDetails.GetValue("GuidPrinter")
                            $SpoolerPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\Servers\$($Split[2])\Printers\$PrinterGUID\DsSpooler"
                            $PrintSpooler = $reglm.OpenSubKey("$SpoolerPath")

                            #Make an object to store in the array
                            $PDetails = [pscustomobject]@{
                                Computer         = $Computer
                                User             = $User
                                PrintServer      = $Split[2]
                                Printer          = $Split[3]
                                PringerGUID      = $PrinterGUID
                                PrinterDesc      = $($PrintSpooler.GetValue("description"))
                                PrinterDriver    = $($PrintSpooler.GetValue("DriverName"))
                                PrinterLocation  = $($PrintSpooler.GetValue("Location"))
                                PrinterPortName  = $($PrintSpooler.GetValue("PortName"))
                                PrinterShareName = $($PrintSpooler.GetValue("printShareName"))
                                PrinterSpooling  = $($PrintSpooler.GetValue("printSpooling"))
                                PrinterPriority  = $($PrintSpooler.GetValue("priority"))
                                PrinterUNC       = $($PrintSpooler.GetValue("uNCName"))
                                PrinterDefault   = if ($Split[3] -eq $DefaultPrinter) { $true }
                            }
                            #Output the object
                            $results += $PDetails
                        }
                    }
                    else {
                        #No printers or access issues
                        Write-Verbose "No Access or No Printers"
                    }
                }
            }
            else {
                Write-Verbose "Ping failed for $Computer, skipping..."
            }
        }
    }

    end {
        $results | Export-Csv -Path $OutputFilePath -NoTypeInformation
    }
}

When I finished my report, I deactivated remote registry again on these computers.

Start-Process -FilePath "C:\Users\ANYUser\Desktop\*.exe" -ArgumentList "/S /v/qn" 

Pnputil /add-driver "C:\Program Files\gs\gs9.50\lib\*.inf" 

Add-PrinterPort -Name "File:(print to file)" 

Add-PrinterDriver -Name "NAME PDF" 

Add-Printer -Name "NAME OF PRINTER" -PortName "File:(print to file)" -DriverName "NAME PDF"

asked Oct 30, 2023 at 13:57

the1fan's user avatar

You might just need to add the -wait parameter to Start-Process so it will wait until the executables have finished running before proceeding with the rest of the setup:

Start-Process -FilePath "C:\Users\ANYUser\Desktop\*.exe" -ArgumentList "/S","/v","/qn" -Wait 

Pnputil /add-driver "C:\Program Files\gs\gs9.50\lib\*.inf" 

Add-PrinterPort -Name "File:(print to file)" 

Add-PrinterDriver -Name "NAME PDF" 

Add-Printer -Name "NAME OF PRINTER" -PortName "File:(print to file)" -DriverName "NAME PDF"

In addition, -ArgumentList should be formatted as an array looks like this:
“Members”,”Of”,”The”,”Array”. One argument in each entry.

answered Oct 30, 2023 at 14:30

Hugo's user avatar

8 bronze badges

Итак начнем. Задача, которую пытались решить — это установка принтеров на терминальные серверы (нынче серверы узла сеансов) фермы. Было несколько путей:

  • установка с помощью групповых политик

Установка вручную — конечно, самый простой путь, но если серверов несколько, то вероятность ошибки велика, да и установка вручную — это скучно. Нужна была автоматизация, поэтому сначала выбрал групповые политики — разворачивание принтера на компьютер (на rdsh).

:/>  Восстановление после ошибок windows 7 как запустить

Выбрал установку на компьютер, потому что AD, которое мне досталось по сути не имело структуры — все пользователи размещались в одном OU. Чтобы навести порядок в AD и распределить пользователей на OU, которые соответствуют либо структуре здания либо штатному расписанию потребуется много времени.

В результате использования GPO выявил следующие нюансы:

  • драйверы принтеров не устанавливаются автоматически или это происходит долго;

  • даже если установить драйверы принтера на rdsh, то установка принтера через gpo происходит только после перезагрузки сервера;

  • после входа пользователя на сервер — список принтеров пуст примерно минут пять бывает больше;

  • принтеры очень часто не отображаются в панели управления, но отображаются в диалоговом окне печати, например в блокноте. В оснастке управления печатью развернутые принтеры не отображаются;

    Power shell добавить локальный принтер windows
  • При удалении принтера из групповой политики принтер частенько не удаляется сразу, даже после gpupdate force.

Самое критичное — это установка принтера только после перезагрузки — довольно неприятная ситуация, когда необходимо выкинуть с терминала 50 пользователей. Поэтому начал смотреть в сторону скрипта на Powershell.

Организацию работы по установке принтера предполагал такой: принтер устанавливается вручную на сервер печати, затем запускается скрипт, который устанавливает этот принтер на все терминальные серверы фермы, с такими же настройками что и на сервере печати.

Удаленная установка принтера
Удаленная установка принтера

В результате сбора информации нашел хорошую статью про PrintBRM – Отказоустойчивый сервер печати на базе Windows, благодарю автора – информация была полезна. Испытал, метод рабочий, но хотелось больше контроля над алгоритмом установки, поэтому использовал Powershell.

Алгоритм скрипта
Алгоритм скрипта
$driversFile= "\\storage\printDrivers\drivers.txt"
$printersFile= "\\storage\printDrivers\printers.txt"
$ACLfolder = "\\storage\printDrivers\acl\"
$csvfile= "\\storage\printDrivers\printers.csv"
$folderDrivers= "\\storage\printDrivers\drivers\"
$terminals = @("tspd-01", "tspd-02", "its-01", "its-02")


$exportFlag=0
#удаляем файл списка названий драйверов
if(Test-Path $ACLfolder){Remove-Item -Path $ACLfolder -Recurse}
if(Test-Path $driversFile){Remove-Item -Path $driversFile}
if(Test-Path $printersFile){Remove-Item -Path $printersFile}
if(Test-Path $csvfile){Remove-Item -Path $csvfile}

Start-Sleep -Seconds 5
#формируем список названий драйверов
$drivers=Get-PrinterDriver | select Name | where {$_.Name -notlike "*Microsoft*" -and  $_.Name -notlike "Remote*"}
foreach ($driver in $drivers) {
write $driver.Name | out-file $driversFile -Append
}

#формируем список принтеров
$printers = get-printer | where {$_.Name -notlike "*Microsoft*" -and  $_.Name -notlike "Remote*"}
#создаем директорию для ACL
Mkdir $ACLfolder
foreach($printer in $printers){
Write $printer.Name | out-file $printersFile -Append
#экспортируем ACL принтера в текстовый файл
$aclfile=$ACLfolder+$printer.Name+".txt"
(Get-Printer $printer.Name -Full).PermissionSDDL | Out-File $aclfile
}

#формируем csv файл с информацией о принтере
get-printer | where {$_.Name -notlike "*Microsoft*" -and  $_.Name -notlike "Remote*"} |Export-CSV $csvfile -NoTypeInformation -Encoding UTF8


#функция экспорта драйверов
function ExportDrivers($folderDrivers){
    #очищаем папку с драйверами
    if(Test-Path $folderDrivers){Remove-Item -Path $folderDrivers -Recurse}
    #получаем список драйверов принтеров
    $PrintDriver = Get-WindowsDriver -Online | where {($_.ClassName -like "Printer")}
    foreach ($print in $PrintDriver){
        write $print
        #Записываем название драйверов НЕ от микрософта
        if($print.ProviderName -ne "Microsoft"){
            #Создаем имя папки
            $folderName=($folderDrivers + $print.Driver).replace('.inf','')
            write $folderName
            #Создаем папку
            Mkdir $folderName
            #экспортируем драйвера принтеров в папку
            pnputil.exe /export-driver $print.Driver $folderName
        }
    }
}

#Запуск экспорта
if($exportFlag -eq 1){ExportDrivers -folderDrivers $folderDrivers}


Write "_____________________"
$pass = "Morkovka10"
$us="Domain\mylogin"
$password = ConvertTo-SecureString -String $pass -AsPlainText -Force
$cred= New-Object System.Management.Automation.PSCredential ($us, $password )
#Запуск удаленной сесии
foreach($server in $terminals){
$s = New-PSSession -computerName $server -authentication CredSSP -credential $cred
Invoke-Command -Session $s -Scriptblock {
             #проброс перемнных в сессию
             $csvfile=$using:csvfile 
             $ACLfolder= $using:ACLfolder
             $folderDrivers=$using:folderDrivers
             $driversFile=$using:driversFile
             $h = hostname
             write "____________________________________ $h ________________________________________________________________________"

             #устанавливаем драйвера в хранилище драйверов
             write "install drivers!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
             $folderDrivers=$folderDrivers+"*.inf"
             pnputil.exe /add-driver $folderDrivers /subdirs /install
             write "install drivers!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
             
             #добавляем отсутствующие драйвера 
             write "_______________________________"
             Write "добавляем отсутствующие драйвера принтеров из хранилища драйверов"
             $drivers = Get-Content -Path $driversFile 
             foreach ($driver in $drivers){
               if((Get-PrinterDriver -Name $driver).Count -eq 0){
                Add-PrinterDriver -Name $driver
               }
             }
               write "_______________________________"


             #Получаем массив объектов - список принтеров на принтсервере из csv
             $printers = $printers =Import-CSV -Path $csvfile

             #Получаем массив локальных принтеров
             $localPrinters = get-printer -Full | where {$_.Name -notlike "*Microsoft*" -and  $_.Name -notlike "Remote*"}

             #удаляем локальные принтеры которых нет на принтсервере

             foreach ($localP in $localPrinters){
                 $match = $printers -match $localP.Name
                 if($match.Count -eq 0){
                     $pname=$localP.Name
                     write "REMOVE $pname - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
                     Remove-Printer -Name $localP.Name
                 }
             }

             Foreach($p in $printers){
                write $p.Name
                write $p.DriverName
                write $p.PortName 
                $aclfile=$ACLfolder+$p.Name+".txt"
                $perms = Get-Content -Path $aclfile
                if((Get-Printer -Name $p.Name).Count -ne 0){
                #синхронизируем ACL
                Set-Printer $p.Name -PermissionSDDL $perms 
                
                #Получаем локальный принтер 
                $localprinter= Get-Printer -Name $p.Name
                
                #Проверяем порт
                if($localprinter.PortName -ne $p.PortName){
                    write "порт НЕ совпадает"
                    #Добавляем порт если его нет
                    if((Get-PrinterPort -Name $p.PortName).Count -eq 0){
                     Add-PrinterPort -Name $p.PortName -PrinterHostAddress $p.PortName
                    }
                    #Добавляем порт принтеру
                    Set-Printer -Name $p.Name -PortName $p.PortName
                }else{write "порт совпадает"}
                #Проверяем драйвер
                if($localprinter.DriverName -ne $p.DriverName){
                 Set-Printer -Name $p.Name -DriverName $p.DriverName
                }
                } else {
                    
                    #Добавляем порт
                    if((Get-PrinterPort -Name $p.Name).Count -eq 0){
                     Add-PrinterPort -Name $p.PortName -PrinterHostAddress $p.PortName
                    }
                    #Добавляем принтер
                    Add-Printer -Name $p.Name -DriverName $p.DriverName -PortName $p.PortName
                    #Добавляем ACL
                    Set-Printer $p.Name -PermissionSDDL $perms
                }
             }
             }
}
             
             

В результате мы получили:

  • удаленную установку принтеров на терминальные серверы без необходимости их перезагрузки;

  • единый сервер администрирования печати — сервер‑печати, который является эталонным — именно с него копируются все настройки устанавливаемых принтеров;

  • простой метод развертывания принтеров, поэтому его можно передать специалистам службы поддержки — установил принтер на сервер печати, настроил права и затем запустил скрипт — все просто!

  • Сервер печати — занимает мало места (в виде ВМ), поэтому можно быстро и легко его бекапить каждый день, поэтому не страшно, если техподдержка начудит — его быстро можно восстановить.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Как организована установка принтеров в вашей организации?

Проголосовали 28 пользователей. Воздержались 4 пользователя.

Microsoft изменила порядок назначения принтера по умолчанию в Windows 10 и 11. Теперь принтером по умолчанию всегда назначается принтер, на котором пользователь успешно печатал в последний раз в текущем местоположении. Таким образом, принтер по-умолчанию в этих версиях Windows может постоянно меняться, если вы иногда печатаете на разных принтерах в разных локациях. В этой статье мы рассмотрим, как назначить принтер по-умолчанию из графического интерфейса Windows, командной строки или через групповые политики.

:/>  Установка Windows 7 второй системой на компьютер с Windows 10.: spayte — LiveJournal

Выбрать принтер по-умолчанию из панели управления Windows

Изменить принтер по-умолчанию в Windows можно через панель Параметры.

  1. Перейдите в Settings -> Printers and Scanners
  2. Чтобы запретить Windows автоматически менять принтер по умолчанию, отключите опцию Let Windows manage my default printerЗапретить выбирать принтер автоматически
  3. Затем выберите в списке принтер, который хотите назначить по умолчанию -> Manage
  4. Выберите опцию Set as default Назначить принтер по -умолчанию в Windows

Таже можно выбрать принтер по умолчанию из классической панели управления Windows. Перейдите в Control Panel -> Device and Printer (или выполните команду
shell:PrintersFolder
). Щелкните по принтеру и выберите Set as default printer.

Панель управления Windows - принтер по умолчанию

Назначить принтер по умолчанию из командной строки PowerShell

Вы можете назначить принтер по умолчанию из командной строки с помощью утилиты wmic. Вывести список принтеров:

wmic printer get name,default

У принтера по умолчанию включен атрибут Default=True.
Изменить принтер по-умолчанию:

wmic printer where name="Имяпринтера" call setdefaultprinter

командная строка wmic - назначить принтер по умолчанию

Также можно использовать PowerShell для управления принтерами.

Вывести список принтеров:

Изменить принтер по-умолчанию:

$Printer = Get-CimInstance -Class Win32_Printer -Filter "Name='HP LaserJet M1530 MFP Series PCL 6'"
Invoke-CimMethod -InputObject $Printer -MethodName SetDefaultPrinter

Чтобы запретить Windows автоматически переназначать принтер по умолчанию, нужно затем изменить значение параметра реестра LegacyDefaultPrinterMode:

REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" -v LegacyDefaultPrinterMode /t REG_DWORD /d 1 /f

Параметр реестра LegacyDefaultPrinterMode - отключить авто выбор принтера по умолчанию

Как задать принтер по-умолчанию через GPO?

Если вам нужно централизованно задать принтер по умолчанию для нескольких пользователей в домене Active Directory, можно использовать GPO.

Brother MFC-L2750DW series,winspool,FILE:

Настройки принтера по умолчанию в реестре Windows

  • Hive:
    HKCU
  • Key Path:
    SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
  • Value Name:
    Device
  • Value Type:
    REG_SZ
  • Value Data:
    Brother MFC-L2750DW series,winspool,FILE:

Назначить принтер по умолчанию на компьютерах через GPO

GPO: Отключить управление принтером, используемым по умолчанию, со стороны Windows

Anthony M

photo credit: https://www.pexels.com/

Using PowerShell to add a network printer to a computer can be quite efficient. Here’s a step-by-step tutorial:

  1. Open PowerShell as Administrator:
  • Right-click on the Start button.
  • Choose “Windows PowerShell (Admin)” or “Command Prompt (Admin).”

2. Check Existing Printers:

3. Add a Network Printer:

Use the Add-Printer cmdlet to add a network printer. You’ll need the printer’s IP address or hostname.

photo credit: Robert McMillen, Troubleshooting IT Remote Administration

4. Set Default Printer (Optional):

If you want to set the added printer as the default printer, use:

Set-PrintDefault -Name "PrinterName"

Replace “PrinterName” with the name of the printer you added.

5. Verify the Addition:

To confirm that the printer has been added, you can use:

photo credit: https://www.pexels.com/

That’s it! You’ve successfully added a network printer using PowerShell. Make sure to replace placeholder values with your actual printer information.

К компьютеру за время его жизни подключаются десятки различных периферийных устройств. Для ускорения повторного подключения Windows сохраняет сведения об этих устройствах. Иногда списки таких устройств становятся слишком большими. В этом случае можно удалить сведения о ненужных гаджетах. Если вы больше не пользуетесь принтером и хотите его удалить, или хотите удалить и повторно установить принтер для решения проблем, Windows 11 и Windows 10 упрощают удаление принтеров.

Если вы используете ПК из Windows 11, перейдите в Настройки > Bluetooth и устройства > Принтеры и сканеры. В Windows 10 перейдите к Настройка > Устройства > Принтеры и сканеры.

Найдите и выберите принтер, который необходимо удалить. В Windows 11 выберите «Удалить». В Windows 10 выберите пункт «Удалить устройство» и нажмите кнопку «Да».

Windows удалила выбранный принтер.

Удаление принтера с помощью диспетчера устройств

Для удаления принтера с помощью диспетчера устройств сначала откройте диспетчер устройств , щелкнув правой кнопкой мыши значок меню «Пуск» и выбрав «Диспетчер устройств».

Выберите «Просмотр» на панели меню, затем включите «Показать скрытые устройства», чтобы принтер отображался, даже если он скрыт.

В этом же окне откройте «Принтеры» и найдите принтер. Если вы не можете найти принтер, разверните «Очереди печати» и найдите его там. Находя его, щелкните правой кнопкой мыши название принтера и выберите «Удалить устройство».

В открывшемся окне «Удалить устройство» включите «Попытка удалить драйвер для данного устройства» (Windows 11) или «Удалить программное обеспечение драйвера для данного устройства» (Windows 10). Затем нажмите «Удалить».

Удалите принтер и драйверы в диспетчере устройств.

Подождите, пока диспетчер устройств удалит выбранный принтер. Затем включите изменения, перезагрузив компьютер с Windows 11 или Windows 10 .

Используйте PowerShell для удаления принтера

Откройте меню «Пуск», найдите PowerShell и выберите «Запуск от имени администратора».

В запросе «Контроль аккаунтов пользователей» (UAC) выберите «Да».

В PowerShell перечислите доступные принтеры, введя следующую команду и нажав Enter: Get-Printer

Из списка принтеров запомните имя принтера, который необходимо удалить. Затем введите команду Remove-Printer -Name “PrinterName”, заменив «PrinterName» на указанное имя, и нажмите Enter. Убедитесь, что имя принтера взято в двойные кавычки.

PowerShell удалил указанный принтер. Вы можете снова запустить Get-Printer, чтобы подтвердить, что он удален.

Оставьте комментарий