1

古い 2003 R2 プリント サーバーから新しい 2008 R2 プリント サーバーへの移行中に、すべてのクライアント プリンター設定を更新するタスクがあります。すべてのクライアントは Powershell 2.0 を搭載した Win7 であり、クライアントで新しいプリンターを追加し、古いプリンターを削除するスクリプトを作成しました。

ただし、クライアントの既定のプリンター設定が台無しになります。既定のプリンターをランダムなプリンターに変更するか、既定のプリンターがまったく設定されていない場合はランダムに見えます。

メソッド 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
}
4

1 に答える 1

0

勘違いしているかもしれませんが、デフォルトのプリンター(defprinter)もserver1にありますよね?したがって、プリンター x へのリンク定義プリンターを作成します。次に、すべてのプリンター (プリンター x を含む) を削除し、(もはや存在しない) defprinter をデフォルトのプリンターに戻そうとします。これは機能せず、ランダムなプリンターがデフォルト属性を取得します。

第 1 に、ループが開始する前に、defprinter の一意のプリンター名 ($printer.name) を保存する必要があります。次に、ループが完了したら、以前のデフォルト プリンターを表す新しく作成されたプリンター wmi-object を検索し (ループ前に保存したプリンター名を使用)、そのデフォルトを作成します。

于 2012-12-13T23:20:20.083 に答える