WBZ-ITS
WBZ-ITS

Reputation: 1

How to map Network Printers with PowerShell and CSV

I want to deploy our Network Printers that are shared from a Print-Server to Windows 10 PCs, on per-machine basis.

Currently we do this with a Kix-Script and ini file, but I want to move this to PowerShell and deploy it as a Startup/Login Script with Group Policy. The deployment must be with PowerShell not purely GPO, with a script we are more flexible to deploy to singular machines.

I've written a PS Script and using a CSV File containing the PCs and Printers to map, but it seams completely wrong. Is there a better way to deploy the printers?

Here are my CSV, 'True' is to set Printer as Default:

#TYPE Selected.System.Management.ManagementObject.Data.DataRow
Name
PC0001
\\SV0002\PR0001, True
\\SV0002\PR00002

Name
PC0002
\\SV0002\PR0001, True
\\SV0002\PR00002​

and the PS-Script:

Get–WMIObject Win32_Printer | where{$_.Network -eq ‘true‘} | foreach{$_.delete()}
$Printers=IMPORT-CSV \\server\$env:username\printers.csv

FOREACH ($Printer in $Printers) {
Invoke-Expression 'rundll32 printui.dll PrintUIEntry /in /q /n $($Printer.Name)'
}​

I edited the csv File, and it looks like this now:

Client;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;Default
PC0001;\\SV0001\PR0001;\\SV0001\PR0002;;;;;;;;;;;;;;pr_01
PC0002;\\SV0001\PR0001;\\SV0001\PR0002;\\SV0001\PR0003;;;;;;;;;;;;;pr_03

We did that with Excel, so it's easier to edit, and save it as csv.

Also where is located, we changed it to \Server\Netlogon\Subfolder\Printers.csv so that also the the Variable is changed to:

$Printers=IMPORT-CSV \\server\Netlogon\Subfolder\printers.csv

But now I think the whole script is wrong?

Upvotes: 0

Views: 13614

Answers (5)

WBZ-ITS
WBZ-ITS

Reputation: 1

I've made some correction and improvements to the script, and found also some Problem that Comes if you use it on a GPO, the changes are following:

CSV:

name,printers,defaultprinter
PC0001,\\SV0001\PR0001;\\SV0001\PR0002,PR0002
PC0002,\\SV0001\PR0001;\\SV0001\PR0003,PR0003
PC0003,\\SV0001\PR0001;\\SV0001\PR0004,PR0004

The Connection Script:

$csv = "\\server\Netlogon\Subfolder\printers.csv"
$Computers = Import-Csv $csv

foreach ($Computer in $Computers){
    If ($Computer.name -eq $env:computername) {
        $Printers = ($Computer.printers).split(";")
        foreach ($Printer in $Printers) {Add-Printer-ConnectionName $Printer -ErrorAction SilentlyContinue}

        (New-Object -ComObject WScript.Network).SetDefaultPrinter("$($Computer.defaultprinter)")
    }
}

And also a disconnect Script when logging off:

#$a = Get-WMIObject -query "Select * From Win32_Printer Where Name = 'Microsoft Print to PDF'"
#$a.SetDefaultPrinter()
$TargetPrinter = "Microsoft Print to PDF"
$ErrorActionPreference = “SilentlyContinue”
$LocalPrinter = GWMI -class Win32_Printer | Where {$_.Name -eq $TargetPrinter}
$LocalPrinter.SetDefaultPrinter()
$ErrorActionPreference = “Stop”

Get-WmiObject -Class Win32_Printer | where{$_.Network -eq ‘true‘}| foreach{$_.delete()}

To disconnect the default printer must be changed, otherwise it won't be disconnected.

After all Script was made, we putted them in a GPO under User Configuration\Policies\Windows Settings\Scripts and there on Logon and Logoff.

You may have some troubles that the GPOs won't run, so here some usefull troubleshooting guides that i found:

The Scripts aren't working as Machine Policies under Startup and Shutdown, they have to be in the User Configuration as mentioned above.

Also you have to configure the Policie that deley the Script of 5 minutes. These are under Computer Configuration\Administrative Templates\System\Group Policy\Configure Logon Script Delay aktivate them and set the delay to 0 minutes, otherwise any Script will be deleyed to 5 minutes after logon.

Also a problem could be, if you are running the GPO on Windows 8/10 System, and you made them on a WIndows 7 PC. Create GPOs allways on the Server 2008/R2 or 2012R2 for this kind of system.

It could be helpfoul also if you configure the Logon/Logoff GPO as follows: As Scriptname "powershell.exe" (without quotes) and as Script Parameters -F "\SERVER\FREIGABE\meinskript.ps1" (with quotes.

I hope this could help someone else.

Thanks to who hleped me. WBZ-ITS

Upvotes: 0

WBZ-ITS
WBZ-ITS

Reputation: 1

I solved the Problem with the Script of James C., many thanks to him, it was a big help!.

The only wrong Thing was that between Add-Printer and $Printer, it had to be -ConnectionName. After that Little Edit in the script, everything was fine.

So we made a GP_Printers, where we putted under Computer Configuration/Windows Settings/Scripts/Startup this Script as printermapping.ps1

Also we putted into Shutdown a PowerShell Script where all Printer Connection are deleted.

Here are all the scripts.

CSV:

name,printers,defaultprinter
PC0001,\\SV0001\PR0001;\\SV0001\PR0002,PR0002
PC0002,\\SV0001\PR0001;\\SV0001\PR0003,PR0003
PC0003,\\SV0001\PR0001;\\SV0001\PR0004,PR0004

Printer Mappings with PowerShell depending on CSV:

$csv = "\\server\Netlogon\Subfolder\printers.csv"
$Computers = Import-Csv $csv

foreach ($Computer in $Computers){
    If ($Computer.name -eq $env:computername) {
        $Printers = ($Computer.printers).split(";")
        foreach ($Printer in $Printers) {Add-Printer-ConnectionName $Printer -ErrorAction SilentlyContinue}

        (New-Object -ComObject WScript.Network).SetDefaultPrinter("$($Computer.defaultprinter)")
    }
}

And the Printer Disconnection:

Get-WmiObject -Class Win32_Printer | where{$_.Network -eq ‘true‘}| foreach{$_.delete()}

I hope this could be helpfoul for others.

Again many thanks to James C.

WBZ-ITS

Upvotes: 0

henrycarteruk
henrycarteruk

Reputation: 13207

Using a CSV like this:

name,printers,defaultprinter
PC0001,\\SV0001\PR0001;\\SV0001\PR0002,PR0002
PC0002,\\SV0001\PR0001;\\SV0001\PR0003,PR0003
PC0003,\\SV0001\PR0001;\\SV0001\PR0004,PR0004

The code would be:

$csv = "\\server\Netlogon\Subfolder\printers.csv"
$Computers = Import-Csv $csv

foreach ($Computer in $Computers){
    If ($Computer.name -eq $env:computername) {
        $Printers = ($Computer.printers).split(";")
        foreach ($Printer in $Printers) {Add-Printer $Printer -ErrorAction SilentlyContinue}

        (New-Object -ComObject WScript.Network).SetDefaultPrinter("$($Computer.defaultprinter)")
    }
}

Upvotes: 1

Starting from Windows 8 :

# Add the printer    
Add-Printer -ConnectionName ("\\" + $printServer + "\" + $printerName) -Name $printerName
# Get the printer
$printer = Get-WmiObject -Query "Select * From Win32_Printer Where ShareName = '$printerName'"
# Set printer as default
$printer.SetDefaultPrinter()

Upvotes: 0

Adamar
Adamar

Reputation: 311

The way we do (did) it here at work was by invoking some VBScript from within the PowerShell script.

Print server and Printer are obtained via AD cmdlets.

$net = New-Object -Com WScript.Network
$net.AddWindowsPrinterConnection("\\" + $PRINT_SERVER + "\" + $PRINTER)

Upvotes: 0

Related Questions