簡體   English   中英

如何使用PowerShell和CSV映射網絡打印機

[英]How to map Network Printers with PowerShell and CSV

我想將每台計算機上與打印服務器共享的網絡打印機部署到Windows 10 PC。

當前,我們使用Kix-Script和ini文件來執行此操作,但是我想將其移至PowerShell並將其作為具有組策略的啟動/登錄腳本進行部署。 部署必須使用PowerShell而非純粹的GPO,我們需要更靈活地將腳本部署到單個機器上。

我編寫了一個PS腳本,並使用了一個包含PC和打印​​機的CSV文件進行映射,但是它接縫完全錯誤。 有沒有更好的方法來部署打印機?

這是我的CSV,“ True”是將Printer設置為Default:

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

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

和PS腳本:

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)'
}​

我編輯了csv文件,現在看起來像這樣:

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

我們使用Excel進行了此操作,因此更易於編輯並將其另存為csv。

同樣在哪里,我們將其更改為\\ Server \\ Netlogon \\ Subfolder \\ Printers.csv,以便變量也更改為:

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

但是現在我認為整個腳本是錯誤的?

我們在這里執行(執行)此操作的方法是從PowerShell腳本中調用一些VBScript。

打印服務器和打印機是通過AD cmdlet獲得的。

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

從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()

使用這樣的CSV:

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

該代碼將是:

$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)")
    }
}

我用James C.的腳本解決了問題,非常感謝他,這是一個很大的幫助!

唯一的錯誤是在Add-Printer和$ Printer之間,它必須是-ConnectionName。 在腳本中執行Little Edit之后,一切都很好。

因此,我們制作了一個GP_Printers,將其放置在“計算機配置” /“ Windows設置” /“腳本” /“將該腳本啟動為Printermapping.ps1”下

另外,我們還關閉了一個PowerShell腳本,該腳本中所有打印機連接均被刪除。

這是所有腳本。

CSV:

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

使用PowerShell的打印機映射取決於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)")
    }
}

和打印機斷開連接:

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

我希望這對其他人有幫助。

再次感謝JamesC。

WBZ-ITS

我對腳本進行了一些更正和改進,還發現了在GPO上使用該腳本時會出現的一些問題,更改如下:

CSV:

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

連接腳本:

$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)")
    }
}

並且在注銷時還有一個斷開腳本:

#$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()}

要斷開連接,必須更改默認打印機,否則不會斷開連接。

制作完所有腳本后,我們將它們放在GPO中的“用戶配置\\策略\\ Windows設置\\腳本”下,並位於“登錄和注銷”位置。

您可能會遇到一些GPO無法運行的麻煩,因此在這里找到了一些有用的故障排除指南:

腳本在“啟動”和“關閉”下不能用作計算機策略,它們必須位於如上所述的用戶配置中。

另外,您還必須配置5分鍾腳本的策略。 這些位於“計算機配置\\管理模板\\系統\\組策略\\配置登錄腳本延遲”下,可以激活它們並將延遲設置為0分鍾,否則任何腳本將在登錄后被延遲5分鍾。

如果您在Windows 8/10系統上運行GPO,並且在Windows 7 PC上制作了GPO,也可能會出現問題。 始終在Server 2008 / R2或2012R2上為此類系統創建GPO。

如果按以下方式配置“登錄/注銷” GPO,也可能是有幫助的:作為腳本名稱“ powershell.exe”(不帶引號)和作為腳本參數-F“ \\ SERVER \\ FREIGABE \\ meinskript.ps1”(帶引號)。

我希望這可以幫助其他人。

多虧誰傷害了我。 WBZ-ITS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM