どうもミツシマです。

今回はActiveDirectory環境において、ユーザーログオン時にネットワークプリンタの接続(追加)と通常使用するプリンタの設定を行うスクリプトを作成・検証してみました。


検証環境は以下の通り
AD環境
DC:Windows Server2016
PC:Windows10 1809


今まではVBSでやっていたりしていましたが、今回はPowersehllにて設定・検証をしてみました。
まずはネットワークプリンタを接続するスクリプトを作成。
内容としてはCSVファイルにコンピュータ名とプリンタ名を記載し、コンピュータ名と合致したネットワークプリンタを最大5個まで追加するスクリプトを作成してみました。


SetNetworkPrinterList.csv
COMPUTERNAME,NetworkPrinter1,NetworkPrinter2,NetworkPrinter3,NetworkPrinter4,NetworkPrinter5
PC01,FAX,,,,
PC02,FAX,,,,
DESKTOP-JURRULG,\\ad-sv01\(テスト)Canon Printer,,\\ad-sv01\Canon LBP9650C Class Driver,,
(続く)



ConnectNetworkPrinter.ps1
#=================================================================================
#CSVファイル内で指定されたネットワークプリンタが接続されていない場合に追加する
#=================================================================================
Function ConnectNetworkPrinter($NetPrinter,$SetPrinter){
    $i = 0
    foreach($Printer in $NetPrinter){
        $Printer = $Printer.Name
        If ($SetPrinter -eq $Printer){
            #Write-Output $SetPrinter'は接続済みです。'
            $i += 1
        }
    }

    If (($i -eq 0)){
    #Write-Output $SetPrinter'を接続します。'
    Add-Printer -ConnectionName $SetPrinter
    }

}
#=================================================================================


#↓ここからメイン処理

#CSVファイルを展開し、変数に取得
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
$CSVPath = $CurrentFolder + "¥SetNetworkPrinterList.csv"
$SetNetworkPrintersInfo = Import-Csv -Path $CSVPath -Encoding Default | Where-Object {$_.COMPUTERNAME -eq $Env:COMPUTERNAME}


#現状のネットワークプリンタ接続状況を変数に取得
$NetworkPrinters = Get-Printer | Where-Object { $_.Type -eq "Connection" }


foreach($info in $SetNetworkPrintersInfo){
$COMPUTER = $Info.COMPUTERNAME
$NetworkPrinter1 = $Info.NetworkPrinter1
$NetworkPrinter2 = $Info.NetworkPrinter2
$NetworkPrinter3 = $Info.NetworkPrinter3
$NetworkPrinter4 = $Info.NetworkPrinter4
$NetworkPrinter5 = $Info.NetworkPrinter5

<#Write-Output $COMPUTER
Write-Output $NetworkPrinter1
Write-Output $NetworkPrinter2
Write-Output $NetworkPrinter3
Write-Output $NetworkPrinter4
Write-Output $NetworkPrinter5#>

    If (-Not[string]::IsNullOrEmpty($NetworkPrinter1)){
        ConnectNetworkPrinter $NetworkPrinters $NetworkPrinter1
    }

    If (-Not[string]::IsNullOrEmpty($NetworkPrinter2)){
        ConnectNetworkPrinter $NetworkPrinters $NetworkPrinter2
    }

    If (-Not[string]::IsNullOrEmpty($NetworkPrinter3)){
        ConnectNetworkPrinter $NetworkPrinters $NetworkPrinter3
    }

    If (-Not[string]::IsNullOrEmpty($NetworkPrinter4)){
        ConnectNetworkPrinter $NetworkPrinters $NetworkPrinter4
    }

    If (-Not[string]::IsNullOrEmpty($NetworkPrinter5)){
        ConnectNetworkPrinter $NetworkPrinters $NetworkPrinter15
    }

}



そして、デフォルトプリンタに設定するスクリプトに関しても同じようにCSVファイルとps1を作成


SetDefaultPrinterList.csv
NCOMPUTERNAME,SetPrinter
PC01,FAX
PC02,FAX
DESKTOP-JURRULG,\\ad-sv01\(テスト)Canon Printer
(続く)



SetDefaultPrinter.ps1
# 「Windowsで通常使うプリンターを管理する」無効化
cmd /c reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v LegacyDefaultPrinterMode /t REG_DWORD /d 1 /f > $null
#「デバイスとプリンターを開く」
#cmd /c "control printers"
#レジストリ設定の変更反映の余裕を持つために3秒ウェイト
Start-Sleep -Seconds 3

#CSVファイルを展開し、自ホスト名の行を変数に取得
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
$CSVPath = $CurrentFolder + "\SetDefaultPrinterList.csv"
#Write-Output $CSVPath
$SetPrinterInfo = Import-Csv -Path $CSVPath -Encoding Default | Where-Object {$_.COMPUTERNAME -eq $Env:COMPUTERNAME}

#プリンタを操作する為にオブジェクト作成
$NetworkObject = New-Object -ComObject WScript.Network

#Write-Output $Env:COMPUTERNAM
#Write-Output '変数$SetPrinterInfoは' $SetPrinterInfo

If (@($SetPrinterInfo).Count -eq 1){

    #Write-Output 'CSVファイルにてセットするプリンタ情報を取得しました。'
    #通常使用するプリンタを設定
    $SetPrinterInfo | ForEach-Object {$NetworkObject.SetDefaultPrinter($_.SetPrinter)}
    #Write-Output 'Success' > ($Env:USERPROFILE + '\Desktop\Success.txt')

}elseif (@($SetPrinterInfo).Count -eq 0){

    #Write-Output '該当するプリンタがありません。。CSVファイルに誤りがあります。'
    #Write-Output 'False0' > ($Env:USERPROFILE + '\Desktop\False0.txt')
    Exit


}else {

    #Write-Output 'セットするプリンタが複数あります。。CSVファイルに誤りがあります。'
    #Write-Output 'False2' > ($Env:USERPROFILE + '\Desktop\False2.txt')
    Exit

}

#通常使用するプリンタを設定例
#(New-Object -ComObject WScript.Network).SetDefaultPrinter(プリンタ名)



1つ補足説明をするとWindows10では、通常使用するプリンタをWindowsが自動で管理する機能が追加されている。これが有効化のままだとユーザーで指定したプリンタが通常使用するプリンタとして反映されないため、最初にレジストリに無効化の設定を実施している。


最後にこれらをログオンスクリプトとして順番に呼び出すスクリプトを作成。
CallLogonPS1.ps1
#ディレクトリ取得
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
$PSFile1 = $CurrentFolder + "¥ConnectNetworkPrinter.ps1"
$PSFile2 = $CurrentFolder + "¥SetDefaultPrinter.ps1"

#PS1実行
.$PSFile1

#PS1実行
.$PSFile2



動作確認もOK!!
これでCSVファイルを編集すれば色々と応用が効くようなスクリプトが出来たのでいいかな〜と!!


最後に各ファイルのリンクを貼っておきます。
SetNetworkPrinterList.csv
ConnectNetworkPrinter.ps1
SetDefaultPrinterList.csv
SetDefaultPrinter.ps1
CallLogonPS1.ps1
スポンサードリンク