我有一项任务是在从旧的2003 R2打印服务器迁移到新的2008 R2打印服务器期间更新所有客户端打印机设置。所有客户端都是带有Powershell 2.0的Win7,我创建了一个脚本,用于添加新打印机并删除客户端上的旧打印机。
然而,它弄乱了客户端上的默认打印机设置,如果它将默认打印机更改为randrom打印机或者根本没有设置默认打印机,则它似乎是随机的。
我正在考虑使用方法Get-WmiObject -Class Win32_Printer -Filter“Default = $ true”,这样可行,我可以看到正确的(和旧的)默认打印机。
但是,如果我尝试将新的默认打印机设置为相同的名称,它就会失败(或者更确切地说,它只是随机发生的事情)。
也许我把函数$ printer.SetDefaultPrinter()放在错误的地方?
代码:
Param (
$newPrintServer = "Server2",
$PrinterLog = "\\LogSVR\PrintMigration$\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
}
答案 0 :(得分:0)
我可能会误解,但默认打印机(defprinter)也位于server1上,对吗?所以你创建一个链接defprinter到打印机x。然后删除所有打印机(包括打印机x),然后再次尝试使用defprinter(不再存在)默认打印机。这不起作用,随机打印机将获得默认属性。
第1,你应该在循环开始之前存储defprinter的唯一printername($ printer.name)。然后当循环完成时:你搜索新创建的代表上一个默认打印机的打印机wmi-object(使用你在预循环中保存的printername)并使其成为默认值。