スキャン機能を備えたネットワークMFPの自動接続[パート2]

京セラM2035dn、Xerox WorkCentre 3615および6505DN



サンドボックスで招待状を正常に受け取った第1部で約束したように、このメモでは、京セラM2035dn、Xerox WorkCentre 3615、6505DNネットワークMFPを接続する方法を示します。 。







たとえどんなに美しい同種のインフラストラクチャであっても、プリンターやMFPの観点から見ても、現実はしばしば独自の条件を設定します。 ユーザー自身が完全に接続し、かつて問題のあったHP MFPから正常にスキャンしている間に、日本人のゲストが会社に来ました-京セラM2035dn。



京セラM2035dn



いつものように、私は居心地の良い管理者の巣には来ませんでしたが、すぐにオブジェクトに行き、HP MFPのように、私は正直それを目にさえ見ませんでした。

まず、ドライバーをダウンロードして内容を見てください。







ネットワーク接続はネットワークIDであることに注意してください!

最初の部分でHP MFPを接続した方法と同様に、devconを介してスキャナーを接続してみましょう。

.\devcon.exe /r install C:\Drivers\Scanners\2035dnscan\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA"







スキャナーが接続され、レジストリーのScannerAddressパラメーターでスキャナーのアドレスを登録し、スキャンを開始します。 スキャンアプリケーションはスキャンされたシートを示し、すべてが正常に機能します。 それは勝利のように思えるかもしれませんが、使用した2番目のスキャンプログラムの起動は喜びを減らしました-スキャナーはその中に現れませんでした。







京セラの開発者は、何らかの理由でドライバーのWIAのみを使用してスキャンを実装しました。TWAINの場合、TWAINインターフェイスをWIAに転送して結果を返すラッパーを個別に設定する必要があります。 このTWAINドライバーのGUIは次のようになります。







同時に、WIAを介して複数のKyoceraスキャナーを接続できますが、TWAINインターフェイスは常に1つだけです。 WIAを使用するか、毎回ユーティリティを実行してスキャナーを切り替えてください。 我慢する必要がありますが、ここでは、ユーザーのマシンでこのユーティリティの起動を回避する方法を見てみましょう。

このユーティリティは、設定をiniファイルに保存します。ネットワークスキャナーごとに1つのKM_TWAIN * .iniファイルと、スキャナーとその設定ファイルの説明を含む1つの結果ファイルです。

1つの接続されたスキャナーの両方のファイルの画面:







これで、インストールは次のようになります。

-devcon経由でスキャナーを接続する

-TWAINユーティリティがインストールされていない場合、インストールします

-スキャナーのアドレスをレジストリに追加します

-接続された京セラスキャナーを検索してレジストリを調べ、レジストリ内のデータに基づいてiniファイルを生成します



次のコードを使用して、前のメモのスキャナー接続機能を拡張します。このコードを最大限にコメントしようとしました。



 #        devcon "M2035dn" { Push-Location 'C:\Drivers\Scanners\ip\2035dnscan\' if ($(Get-Platform) -eq "Windows x64") { .\devconx64.exe /r install $dest\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA" } else { .\devcon.exe /r install $dest\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA" } Pop-Location #     kyocera,       $twain = Get-WMIObject -Class Win32_Product -Filter 'Name = "Kyocera TWAIN Driver"' if (!($twain)) { Push-Location 'C:\Drivers\Scanners\2035dnscan\TWAIN' .\setup.exe /S /v /qn Pop-Location } #            $scanclass = 'HKLM:\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}' #        ,        $item = (Get-ChildItem $scanclass | Where-Object Name -match "\d{4}$" | Select -Last 1).PSChildName #    New-ItemProperty "$scanclass\$item\DeviceData" -Name "ScannerAddress" -Value $ipaddress | Out-Null #     Foreach-Object,     #       ,       ; #    process      Get-ChildItem $scanclass | Foreach-Object -Begin { $count = 0 Add-Type -As System.Web #  ,    $pass = '43srWkUjR/8=' $scanitem = @{} $filelist = @() } -Process { $path = $_.Name -replace 'HKEY_LOCAL_MACHINE', 'HKLM:' $prop = Get-ItemProperty $path if ($prop.Vendor -eq 'Kyocera') { $count ++ $twfilename = "KM_TWAIN$count`.INI" $devicedata = Get-ItemProperty "$path\DeviceData" $cont = @{'Unit'='0';'ScannerAddress'=$devicedata.ScannerAddress; 'SSL'='0'} $auth = @{'Auth'='0';'UserName'=''; 'Account'='0'; 'ID'='';'Password'=$pass} $twcont = @{'Contents'=$cont; 'Authentication'=$auth} Out-IniFile -inputobject $twcont -FilePath "$env:temp\$twfilename" $filelist += , "$env:temp\$twfilename" $devicename = $devicedata.'Model Name' + " #$count" $modelname = $devicedata.'Model Name' $scanreg = @{'Name'=$devicename;'Model'=$modelname;'DefFile'=$twfilename;'LastScan'='';'ScanList'='';'Pos'=($count-1)} $scanitem.Add("Scanner$count", $scanreg) } } -End { $regfilename = 'RegList.ini' $settings = @{'Type'='4'; 'DefaultUse'=$count;'RegNum'=$count;} $reglist = @{'Setting'=$settings} $reglist += $scanitem Out-IniFile -inputobject $reglist -FilePath "$env:temp\$regfilename" $filelist += , "$env:temp\$regfilename" } #   ini-        Get-ChildItem $env:systemdrive\users -Directory -Recurse -Include 'appdata' -Force | ForEach-Object { $kyodir = $_.FullName + "\Roaming\Kyocera\KM_TWAIN" If (!(Test-Path $kyodir)) { New-Item -Type Directory -Path $kyodir } else { Remove-Item "$kyodir\*" -Recurse } $filelist | ForEach-Object { Copy-Item $_ $kyodir -Force | Out-Null } } }
      
      





スクリプトでは、iniファイルでハッシュテーブル出力関数を使用しました。そのコードは次のとおりです。



 function Out-IniFile($inputobject, $filepath) { # .Example # $Category1 = @{'Key1'='Value1';'Key2'='Value2'} # $Category2 = @{'Key1'='Value1';'Key2'='Value2'} # $NewINIContent = @{'Category1'=$Category1;'Category2'=$Category2} # Out-IniFile -inputobject $NewINIContent -FilePath 'C:\MyNewFile.INI' $outfile = New-Item -ItemType File -Path $filepath -Force foreach ($i in $inputobject.keys) { Add-Content -Path $outfile -Value "[$i]" Foreach ($j in ($inputobject[$i].keys | Sort-Object)) { Add-Content -Path $outfile -Value "$j=$($inputobject[$i][$j])" } Add-Content -Path $outfile -Value '' } }
      
      







Xerox WorkCentre 3615および6505DN



このコードは正常に機能し、おそらく6か月間、風が再び逆風になるまで、問題はありませんでした。 ゼロックスに向けて。

2台の新しいMFP、WorkCentre 3615とWorkCentre 6505DNのIPアドレスを含む手紙がOutlookに落ちました。 新しいMFPに会うときの思考の道はすでに破られているので、ドライバーを開いて見慣れたものを見ます:







そして気分が良くなりました©



ドライバーを解凍し、コンソールを起動して、実行します:

.\devcon.exe /r install C:\Drivers\Scanners\xx3615\xrszdim.inf "NON_PNP&WorkCentre3615"







スキャナーが接続され、Xerox開発者のみからの新しい回避策が表示されます。







IPを処方するためのドライバーの作者によるもう1つの奇妙なユーティリティであり、インストール中にドライバーから起動します。 そのため、ユーザーからそれを隠すために、スクリプトでそれを釘付けします。一般に、それは重要ではありません。



次に、スキャナ接続機能を拡張する方法を例3615で示します。 異なるドライバーファイル名とIDを除いて、6506DNとほとんど変わりません。



 "3615" { Push-Location 'C:\Drivers\Scanners\xx3615\' if ($(Get-Platform) -eq "Windows x64") { .\devconx64.exe /r install C:\Drivers\Scanners\xx3615\xrszdim.inf "NON_PNP&WorkCentre3615" } else { .\devcon.exe /r install C:\Drivers\Scanners\xx3615\xrszdim.inf "NON_PNP&WorkCentre3615" } Pop-Location Get-Process "AIOScanSettings" | Stop-Process -Force #         reg add, #     cmd,    New-ItemProperty    &rg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "EnableEnhancedBW" /t REG_DWORD /d 1 /f &rg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "ISO_B_Series" /t REG_DWORD /d 1 /f &rg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "IP Address" /t REG_SZ /d $ipAddress /f }
      
      







これで、ネットワークMFPの動物園全体を接続することができ、何も恐れることはありません。何らかの魔法を追加することは残っています... magic snmp!



snmpによってネットワーク上の多機能デバイスを探しています



SNMP(Simple Network Management Protocol)は、TCP / UDPアーキテクチャに基づいてIPネットワーク内のデバイスを管理するための標準インターネットプロトコルです。

en.wikipedia.org/wiki/SNMP




powershellからsnmpを使用するには、スクリプトでsharpsnmpオープンライブラリを使用しました。その使用の詳細については、vwiki.co.uk / SNMP_and_PowerShellを参照してください。

ライブラリを接続した後、情報の取得は、Ipとuidを使用したInvoke-SNMPget関数の呼び出しに限定されます。最後の関数は簡単にgoogleになります。

コード例:

Invoke-SNMPget $ip .1.3.6.1.2.1.25.3.2.1.3.1







検索の結果は、これを行う方法を1つ下のコマンドで表示します。







目的のプリンターを選択し、[OK]をクリックします。複数選択も可能です。この場合、選択したすべてのプリンターが接続されます。

転送されたオブジェクトを表示するOut-GridViewコマンドレットは、この便利なGUIマジックを提供します。 PassThruパラメーターを指定して呼び出した場合、[OK]をクリックすると、選択したオブジェクトがパイプラインに沿ってさらに渡されます。パイプラインから順番にパラメーターを指定してドライバーインストール関数を呼び出すだけです。



簡略化された形式では、スクリプトは次の形式を取ります。

 $hosts | Out-GridView -Title "   " -PassThru | Foreach-Object { $printername = $_.Name $printersource = $_.Source switch -regex ($printername) { "xerox.+3615" { $modelname = "Xerox WorkCentre 6505DN PCL 6" $driverpath = 'C:\Drivers\Scanners\xx6505\xrxmozi.inf' } } Write-Host "  IP  $printerName" Add-PrinterPort $modelname $printersource Write-Host "   $printername" Add-PrinterDriver $modelname $driverpath Write-Host "   $printername" Add-Scanner $printersource $modelname }
      
      







プリンターの応答を調査する過程で、プリンターでドライバーで指定された名前とは異なる名前が付けられることがあるという事実に直面しました。



 switch -regex ($printername) { "hp.+305\d" { $modelName = "HP LaserJet 3050 Series PCL 6" } "hp.+3390" { $modelName = "HP LaserJet 3390 Series PCL 6" } "xerox.+3615" { $modelName = "Xerox WorkCentre 3615 PCL6" } "xerox.+650[0,5]DN" { $modelName = "Xerox WorkCentre 6505DN PCL 6" } }
      
      







ネットワークプリンターを検索して接続する完成したスクリプトの完全なコード
 $ErrorActionPreference = "silentlycontinue" function Main { #    $driversdistrib = 'C:\Drivers\' #  snmp  $snmplibpath = Join-Path (Get-Location).path "\SharpSnmpLib.dll" if (Test-Path $snmplibpath) { [reflection.assembly]::LoadFrom((Resolve-Path $snmplibpath)) } else { Write-Host "   SharpSnmpLib" Exit } #  ,   ,     /24 $network = (Get-IPaddress).ToString() -replace "\.[0-9]{1,3}$" #        $hosts = 10..40 | ForEach-Object { $ip = "$network.$_" $snmpanswer= $null $snmpanswer = Invoke-SNMPget $ip .1.3.6.1.2.1.25.3.2.1.3.1 if ($snmpanswer) { #          $hosts [pscustomobject]@{ Name = $snmpanswer.Data; Source = $ip; } } } #       PassThru,       $hosts | Out-GridView -Title "   " -PassThru | Foreach-Object { $printername = $_.Name $printersource = $_.Source switch -regex ($printername) { "hp.+305\d" { $printername = "HP LaserJet 3050 Series PCL 6" $driverpath = Join-Path $driversdistrib 'Printers\3050\hppcp601.inf' } "hp.+3390" { $printername = "HP LaserJet 3390 Series PCL 6" $driverpath = Join-Path $driversdistrib 'Printers\3050\hppcp601.inf' } "hp.+153[0,6]" { $printername = "HP LaserJet M1530 MFP Series PCL 6" $driverpath = Join-Path $driversdistrib 'Printers\1530\hpc1530c.inf' } "hp.+1522" { $printername = "HP LaserJet M1522 MFP Series PCL 6" $driverpath = Join-Path $driversdistrib 'Printers\1522\hppcp608.inf' } "M2035dn" { $printername = "Kyocera ECOSYS M2035dn KX" $driverpath = Join-Path $driversdistrib 'Printers\2035dn\OEMSETUP.INF' } "xerox.+3615" { $printername = "Xerox WorkCentre 3615 PCL6" $driverpath = Join-Path $driversdistrib 'Scanners\xx3615\x2GPROX.inf' } "xerox.+650[0,5]DN" { $printername = "Xerox WorkCentre 6505DN PCL 6" $driverpath = Join-Path $driversdistrib 'Scanners\xx6505\xrxmozi.inf' } } Write-Host "  IP  $printerName" Add-PrinterPort $printername $printersource Write-Host "   $printername" Add-PrinterDriver $printername $driverpath Write-Host "   $printername" Add-Scanner $printersource $printername } } function Add-PrinterPort ($printersource) { &cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prnport.vbs ` -a -r $printersource -h $printersource -o RAW -n 9100 | Out-Null } function Add-PrinterDriver ($printerName, $driverpath) { $folder = Split-Path $driverpath cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prndrvr.vbs ` -a -m $printerName -e Get-Platform -h $folder -i $driverpath } function Add-Scanner ($ipaddress, $printername) { switch -regex ($printername) { "1530" { Push-Location (Join-Path $driversdistrib 'Scanners\1536scan\') if ($(Get-Platform) -eq "Windows x64") { .\hppniscan64.exe -f "hppasc16.inf" -m "vid_03f0&pid_012a&IP_SCAN" -a $ipAddress -n 1 } else { .\hppniscan01.exe -f "hppasc16.inf" -m "vid_03f0&pid_012a&IP_SCAN" -a $ipAddress -n 1 } Pop-Location } "(305\d)|(3390)" { Push-Location (Join-Path $driversdistrib 'Scanners\3055scan\') switch -regex ($printername) { "3050" { .\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3217&IP_SCAN" -a $ipAddress -n 1 } "3052" { .\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3317&IP_SCAN" -a $ipAddress -n 1 } "3055" { .\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3417&IP_SCAN" -a $ipAddress -n 1 } "3390" { .\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3517&IP_SCAN" -a $ipAddress -n 1 } } Pop-Location } "1522" { Push-Location (Join-Path $driversdistrib 'Scanners\1522scan\') if ($(Get-Platform) -eq "Windows x64") { .\hppniscan64.exe -f "hppasc08.inf" -m "vid_03f0&pid_4517&IP_SCAN" -a $ipAddress -n 1 } else { .\hppniscan01.exe -f "hppasc08.inf" -m "vid_03f0&pid_4517&IP_SCAN" -a $ipAddress -n 1 } Pop-Location } "M2035dn" { Push-Location (Join-Path $driversdistrib 'Scanners\2035dnscan\') if ($(Get-Platform) -eq "Windows x64") { .\devconx64.exe /r install $dest\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA" } else { .\devcon.exe /r install $dest\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA" } Pop-Location $twain = Get-WMIObject -Class Win32_Product -Filter 'Name = "Kyocera TWAIN Driver"' if (!($twain)) { Push-Location (Join-Path $driversdistrib 'Scanners\2035dnscan\TWAIN') .\setup.exe /S /v /qn Pop-Location } $scanclass = 'HKLM:\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}' $item = (Get-ChildItem $scanclass | Where-Object Name -match "\d{4}$" | Select -Last 1).PSChildName New-ItemProperty "$scanclass\$item\DeviceData" -Name "ScannerAddress" -Value $ipAddress | Out-Null Get-ChildItem $scanclass | ForEach-Object -Begin { $count = 0 Add-Type -As System.Web $pass = [System.Web.Security.Membership]::GeneratePassword(12,2) $scanitem = @{} $filelist = @() } -Process { $path = $_.Name -replace 'HKEY_LOCAL_MACHINE', 'HKLM:' $prop = Get-ItemProperty $path if ($prop.Vendor -eq 'Kyocera') { $count ++ $twfilename = "KM_TWAIN$count`.INI" $devicedata = Get-ItemProperty "$path\DeviceData" $cont = @{'Unit'='0';'ScannerAddress'=$devicedata.ScannerAddress; 'SSL'='0'} $auth = @{'Auth'='0';'UserName'=''; 'Account'='0'; 'ID'='';'Password'=$pass} $twcont = @{'Contents'=$cont; 'Authentication'=$auth} Out-IniFile -inputobject $twcont -FilePath "$env:temp\$twfilename" $filelist += , "$env:temp\$twfilename" $devicename = $devicedata.'Model Name' + " #$count" $modelname = $devicedata.'Model Name' $scanreg = @{'Name'=$devicename;'Model'=$modelname;'DefFile'=$twfilename;'LastScan'='';'ScanList'='';'Pos'=($count-1)} $scanitem.Add("Scanner$count", $scanreg) } } -End { $regfilename = 'RegList.ini' $settings = @{'Type'='4'; 'DefaultUse'=$count;'RegNum'=$count;} $reglist = @{'Setting'=$settings} $reglist += $scanitem Out-IniFile -inputobject $reglist -FilePath "$env:temp\$regfilename" $filelist += , "$env:temp\$regfilename" } Get-ChildItem $env:systemdrive\users -Directory -Recurse -Include 'appdata' -Force | ForEach-Object { $kyodir = $_.FullName + "\Roaming\Kyocera\KM_TWAIN" If (!(Test-Path $kyodir)) { New-Item -Type Directory -Path $kyodir } else { Remove-Item "$kyodir\*" -Recurse } $filelist | ForEach-Object { Copy-Item $_ $kyodir -Force | Out-Null } } } "6505" { Push-Location (Join-Path $driversdistrib 'Scanners\xx6505\') if ($(Get-Platform) -eq "Windows x64") { .\devconx64.exe /r install $dest\xrsmoim.inf "NON_PNP&WorkCentre6505" } else { .\devcon.exe /r install $dest\xrsmoim.inf "NON_PNP&WorkCentre6505" } Pop-Location Get-Process "AIOScanSettings" | Stop-Process -Force &rg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 6505\TwainDriver" /v "EnableEnhancedBW" /t REG_DWORD /d 1 /f &rg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 6505\TwainDriver" /v "IP Address" /t REG_SZ /d $ipAddress /f } "3615" { Push-Location (Join-Path $driversdistrib 'Scanners\xx3615\') if ($(Get-Platform) -eq "Windows x64") { .\devconx64.exe /r install $dest\xrszdim.inf "NON_PNP&WorkCentre3615" } else { .\devcon.exe /r install $dest\xrszdim.inf "NON_PNP&WorkCentre3615" } Pop-Location Get-Process "AIOScanSettings" | Stop-Process -Force #    rg,   ,     ® &rg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "EnableEnhancedBW" /t REG_DWORD /d 1 /f &rg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "ISO_B_Series" /t REG_DWORD /d 1 /f &rg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "IP Address" /t REG_SZ /d $ipAddress /f } } } function Get-IPaddress { $ipWmiObject = Get-WmiObject Win32_NetworkAdapterConfiguration -filter "IPEnabled = 'True'" $ipWmiObject.IPAddress -match "^192\.([0-9]{1,3}\.){2}[0-9]{1,3}$" } function Get-Platform { if ([System.Environment]::Is64BitOperatingSystem) { "Windows x64" } else { "Windows NT x86" } } function Out-IniFile($inputobject, $filepath) { # .Example # $Category1 = @{'Key1'='Value1';'Key2'='Value2'} # $Category2 = @{'Key1'='Value1';'Key2'='Value2'} # $NewINIContent = @{'Category1'=$Category1;'Category2'=$Category2} # Out-IniFile -inputobject $NewINIContent -FilePath 'C:\MyNewFile.INI' $outfile = New-Item -ItemType File -Path $filepath -Force foreach ($i in $inputobject.keys) { Add-Content -Path $outfile -Value "[$i]" Foreach ($j in ($inputobject[$i].keys | Sort-Object)) { Add-Content -Path $outfile -Value "$j=$($inputobject[$i][$j])" } Add-Content -Path $outfile -Value '' } } function Invoke-SNMPget { param ( [string]$sIP, $sOIDs, [string]$Community = "public", [int]$UDPport = 161, [int]$TimeOut=30 ) $vList = New-Object 'System.Collections.Generic.List[Lextm.SharpSnmpLib.Variable]' foreach ($sOID in $sOIDs) { $oid = New-Object Lextm.SharpSnmpLib.ObjectIdentifier ($sOID) $vList.Add($oid) } $ip = [System.Net.IPAddress]::Parse($sIP) $svr = New-Object System.Net.IpEndPoint ($ip, 161) $ver = [Lextm.SharpSnmpLib.VersionCode]::V1 try { $msg = [Lextm.SharpSnmpLib.Messaging.Messenger]::Get($ver, $svr, $Community, $vList, $TimeOut) } catch { return $null } $res = @() foreach ($var in $msg) { $line = "" | Select OID, Data $line.OID = $var.Id.ToString() $line.Data = $var.Data.ToString() $res += $line } $res } . Main
      
      









今日はこれですべてです。私のメモが、ネットワークプリンターの問題を忘れ、PowerShellを学習する時間を空けるのに役立つことを願っています。

ここまで読んでくれた人に注意してくれてありがとう;-)



All Articles