【问题标题】:How to map Network Printers with PowerShell and CSV如何使用 PowerShell 和 CSV 映射网络打印机
【发布时间】:2017-09-20 20:44:08
【问题描述】:

我想在每台机器上部署我们从打印服务器共享的网络打印机到 Windows 10 PC。

目前我们使用 Kix 脚本和 ini 文件执行此操作,但我想将其移动到 PowerShell 并将其部署为具有组策略的启动/登录脚本。必须使用 PowerShell 而不是纯粹的 GPO 进行部署,使用脚本可以更灵活地部署到单个机器上。

我编写了一个 PS 脚本并使用一个包含 PC 和打印机的 CSV 文件进行映射,但它的接缝完全错误。有没有更好的方法来部署打印机?

这是我的 CSV,“True”是将打印机设置为默认值:

#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

但现在我觉得整个剧本都错了?

【问题讨论】:

  • 您列为 csv 的内容不是 csv 文件。你能发布一个带有标题的csv文件的例子吗?
  • 嗨詹姆斯。是的,我现在喜欢它。我创建的新版本是这样的:codeClient;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;Default PC0001;\\SV0001 \PR0001;\\SV0001\PR0002;;;;;;;;;;;;;1 PC0002;\\SV0001\PR0001;\\SV0001\PR0002;\\SV0001\PR0003;;;;;;;; ;;;;;3code
  • 最好编辑您的问题,因为 cmets 中的格式是有限的。编辑链接就在您的问题标签下方。
  • 嗨詹姆斯。我刚刚编辑了我的问题并对我的脚本进行了一些更改。看看吧。

标签: windows powershell csv printing


【解决方案1】:

我们在这里工作的方式是从 PowerShell 脚本中调用一些 VBScript。

打印服务器和打印机通过 AD cmdlet 获取。

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

【讨论】:

  • 嗨阿达玛。感谢您的回答,但我们不希望任何其他脚本语言作为 PS,所以这不是一个选项。无论如何,谢谢。$
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    像这样使用 CSV:

    名称,打印机,默认打印机 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)")
        }
    }
    

    【讨论】:

    • 嗨詹姆斯。非常感谢您提供此脚本,这正是我正在寻找的。不幸的是,我在执行时遇到错误,完全限定的错误 ID 是:AmbiguosparameterSet,Add-Printer。类别信息是 InvalidArgument: (:) [Add-Printer], ParameterBindingExeption。错误可能在哪里?
    【解决方案4】:

    我用 James C. 的脚本解决了这个问题,非常感谢他,帮了大忙!

    唯一的错误是在 Add-Printer 和 $Printer 之间,它必须是 -ConnectionName。在脚本中的那个小编辑之后,一切都很好。

    所以我们制作了一个 GP_Printers,我们把这个脚本放在 Computer Configuration/Windows Settings/Scripts/Startup 这个 Script as printermapping.ps1 下

    我们还在 Shutdown 中添加了一个 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()}
    

    我希望这对其他人有帮助。

    再次感谢 James C.

    WBZ-ITS

    【讨论】:

      【解决方案5】:

      我对脚本进行了一些更正和改进,还发现如果在 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 中的 User Configuration\Policies\Windows Settings\Scripts 下,然后登录和注销。

      您可能会遇到一些 GPO 无法运行的问题,所以这里有一些我发现的有用的故障排除指南:

      脚本在启动和关闭下不能作为机器策略工作,它们必须在上面提到的用户配置中。

      您还必须配置延迟 5 分钟脚本的策略。这些在计算机配置\管理模板\系统\组策略\配置登录脚本延迟下激活它们并将延迟设置为0分钟,否则任何脚本将在登录后延迟到5分钟。

      如果您在 Windows 8/10 系统上运行 GPO,并且在 WIndows 7 PC 上创建它们,则可能会出现问题。始终在 Server 2008/R2 或 2012R2 上为此类系统创建 GPO。

      如果您将登录/注销 GPO 配置如下:作为脚本名称“powershell.exe”(不带引号)和脚本参数 -F “\SERVER\FREIGABE\meinskript.ps1”(带引号。

      我希望这可以帮助其他人。

      感谢帮助我的人。 WBZ-ITS

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 2023-03-13
        • 2023-03-29
        • 2011-04-12
        • 2013-01-22
        • 1970-01-01
        相关资源
        最近更新 更多