web-dev-qa-db-ja.com

すべてのTCP / IPプリンタポ​​ートでSNMPステータスを無効にする

Windows 7/8 [.1]では、管理者としてコマンドラインからプリンターとポートの情報を構成できます。次に例を示します。

cd /d %WINDIR%\System32\Printing_Admin_Scripts\en-US
prnmngr -s computer-01 -l

ログインした資格情報を使用して、computer-01に接続されているプリンターを一覧表示します。これにより、プリンタポ​​ートを含む多くの出力行が生成されます。私の目標は、TCP/IPポートであると想定してプリンタポ​​ートを見つけ、prnportコマンドを実行してそのポートのSNMPステータスを無効にすることです。以下は、2つの異なるプリンターの出力例です。USBであり、もう1つはTCP/IPプリンターです。

Server name
Printer name JMC-KMC224-BW
Share name
Driver name KONICA MINOLTA C364SeriesPCL
Port name IP_192.168.0.11
Comment
Location
Print processor KOAYTJ_P
Data type RAW
Parameters
Attributes 2628
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle
Extended printer status Unknown
Detected error state Unknown
Extended detected error state Unknown

Server name
Printer name DYMO LabelWriter 400
Share name
Driver name DYMO LabelWriter 400
Port name USB001
Comment
Location
Print processor winprint
Data type RAW
Parameters
Attributes 2624
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle
Extended printer status Unknown
Detected error state Unknown
Extended detected error state Unknown

(注:これはX-Yの問題ではありません。問題は製造元に知られており、SNMPを無効にすることが既知の解決策です。)

TCP/IPポートであるポート名を見つけて、それをprnportコマンドに対して実行できる変数に配置するにはどうすればよいですか?

1
Canadian Luke

問題の1つは、ポートnameがフリーテキストであるということです。 IPアドレスであるとは限りません。プリンタを設定する人が名前をIP_で始まるように明示的に設定していることが確実でない限り、それは保証されません。

可能であれば、PowerShellの使用をお勧めします。 Get-PrinterPortおよびSet-PrinterPropertyまたは多分Set-PrintConfigurationコマンドレット( Win10ドキュメントWin8ドキュメントWin8.1ドキュメント )とても便利に見えます。残念ながら、それらは Windows8またはServer2012以降でのみ使用可能 です。現時点ではWindows7にしかアクセスできず、テストできません。


それができない場合は、最初にprnportを経由するのではなく、prnmngrを直接使用できます。 prnport -lは「すべてのTCPポートを一覧表示」します。これをDavidと同様のスクリプトと組み合わせて使用​​すると、正しい結果が得られます。

注意:設定によっては、prnport呼び出しをcscript %windir%\System32\Printing_Admin_Scripts\en-US\prnport.vbsに置き換える必要がある場合があります。また、リージョンen-USは変更される可能性があります。

for /f "tokens=1,2,*" %%a in ('prnport -s computer-01 -l ^| find "Port name"') do (
    prnport -t -s computer-01 -r "%%c" -md
)

簡単な説明:

  • これは拡張されたforループです。詳細については、for /?を参照してください。
  • 出力のallPort name foo行をループし、それらからfooを取得しています。
  • tokens=1,2,*を指定することにより、結果文字列をスペースでトークン化し、%%aPortに、%%bnameに、%%cをすべてに設定します。後(それがアスタリスクの意味です)。

コンピューター名を別の変数として渡すことをお勧めします。

また、TCP/IPプリンターが存在しない場合は処理されないことに注意してください。ループ本体は実行されるべきではないので、何もしないと思います。


もう1つのオプションは、WMIを直接使用することです。これは、プリンター管理スクリプトが内部で行うことです。

2
Bob