在新打印服务器上保留旧的默认打印机名称



我有一个任务,在从旧的 2003 R2 打印服务器迁移到新的 2008 R2 打印服务器期间更新所有客户端打印机设置。所有客户端都是带有Powershell 2.0的Win7,我创建了一个脚本,用于添加新打印机并删除客户端上的旧打印机。

但是,它会弄乱客户端上的默认打印机设置,如果它将默认打印机更改为 randrom 打印机或根本没有设置默认打印机,它似乎是随机的。

我正在考虑使用方法Get-WmiObject -Class Win32_Printer -Filter "Default = $true"并且有效,我可以看到正确(和旧的)默认打印机。

但是,如果我尝试将新的默认打印机设置为相同的名称,它会失败(或者更准确地说,它只是随机发生的情况)。

也许我把函数放在$printer。将默认打印机()设置在错误的位置?

法典:

 Param (
    $newPrintServer = "Server2",
    $PrinterLog = "\LogSVRPrintMigration$PrintMigration.csv"
)
<#
    #Header for CSV log file:
    "COMPUTERNAME,USERNAME,PRINTERNAME,RETURNCODE-ERRORMESSAGE,DATETIME,STATUS" | 
        Out-File -FilePath $PrinterLog -Encoding ASCII
#>
Try {
    Write-Verbose ("{0}: Checking for printers mapped to old print server" -f $Env:USERNAME)
    $printers = @(Get-WmiObject -Class Win32_Printer -Filter "SystemName='\\Server1'" -ErrorAction Stop)
    $DefPrinter = Get-WmiObject -Class Win32_Printer -Filter "Default = $true"
    If ($printers.count -gt 0) {        
        ForEach ($printer in $printers) {
            Write-Verbose ("{0}: Replacing with new print server name: {1}" -f $Printer.Name,$newPrintServer)
            $newPrinter = $printer.Name -replace "Server1",$newPrintServer  
            $returnValue = ([wmiclass]"Win32_Printer").AddPrinterConnection($newPrinter).ReturnValue                
            If ($returnValue -eq 0) {
                "{0},{1},{2},{3},{4},{5}" -f $Env:COMPUTERNAME,
                                             $env:USERNAME,
                                             $newPrinter,
                                             $returnValue,
                                             (Get-Date),
                                             "Added Printer" | Out-File -FilePath $PrinterLog -Append -Encoding ASCII            
                Write-Verbose ("{0}: Removing" -f $printer.name)
                $printer.Delete()
                "{0},{1},{2},{3},{4},{5}" -f $Env:COMPUTERNAME,
                                             $env:USERNAME,
                                             $printer.Name,
                                             $returnValue,
                                             (Get-Date),
                                             "Removed Printer" | Out-File -FilePath $PrinterLog -Append -Encoding ASCII
                         $DefPrinter.SetDefaultPrinter()            
} Else {
                Write-Verbose ("{0} returned error code: {1}" -f $newPrinter,$returnValue) -Verbose
                "{0},{1},{2},{3},{4},{5}" -f $Env:COMPUTERNAME,
                                             $env:USERNAME,
                                             $newPrinter,
                                             $returnValue,
                                             (Get-Date),
                                             "Error Adding Printer" | Out-File -FilePath $PrinterLog -Append -Encoding ASCII
            }
        }
    }
} Catch {
    "{0},{1},{2},{3},{4},{5}" -f $Env:COMPUTERNAME,
                                 $env:USERNAME,
                                 "WMIERROR",
                                 $_.Exception.Message,
                                 (Get-Date),
                                 "Error Querying Printers" | Out-File -FilePath $PrinterLog -Append -Encoding ASCII
}

我可能是误解了,但默认打印机(defprinter)也位于server1上,对吧? 因此,您创建了一个指向打印机X的链接,然后删除所有打印机(包括打印机X),并尝试再次使Defprinter(不再存在)成为默认打印机。这不起作用,随机打印机将获得默认属性。

首先,您应该在循环开始之前存储 defprinter 的唯一打印机名称 ($printer.name)。 然后,当循环完成时:搜索新创建的打印机WMI对象,该对象表示以前的默认打印机(使用您在循环前保存的打印机名称)并将其设为默认值。

最新更新