会計時に、彼らはプリンターを交換しました。 「全員を再接続する必要があります」







サービスデスクシステム内のこのようなアプリケーションが目を引き、トーンを落とす場合は、おそらく便利な集中型プリンター管理をまだ設定していないでしょう。 この問題を修正する時が来ました。







むしろ、この記事は、この球状の法人を真空に置いておらず、仮想プリンターを使用して、HP M8xx、またはRicoh Pro 8xxxでの印刷にパスを適用していない人向けです。 いつものように、スクリプト、GPO、そして再びスクリプトを用意しています。







1つの接続ポイントでプリンターを収集します



生活を楽にする最初の手段として、組織内のすべてのプリンターを展開できるプリントサーバーを起動することをお勧めします。 理想的には、これは個別の仮想マシンであり、すべてのプリンターがネットワークに接続され、プリントサーバーからのみアクセスできる個別のVLANに出力されます。 ネットワークプリンターを使用できない場合は、極端な場合、USB \ LPTプリンターを搭載したコンピューターをプリントサーバーに変えることができます。 たとえば、 rawprintserverユーティリティを使用します。







メンテナンスの容易さに加えて、単一のプリントサーバーを使用する構成では、Microsoft-Windows-PrintService / Operationalログを解析することにより、「ニーハイ」の印刷レポートを簡単に実装できます。 この資料「 Windowsシステムでログを希望どおりに処理-ログ分析」がこの問題の解決に役立つことを願っており、例として次のPowerShellスクリプトを提供します。







$events = Get-WinEvent -FilterHashtable @{LogName = "Microsoft-Windows-PrintService/Operational"; ID = 307} | foreach{ New-Object PSobject -Property @{ Time_Created = $_.TimeCreated Document_Number = $_.Properties[0].value Document_Name = $_.Properties[1].value UserID = $_.Properties[2].value Printer = $_.Properties[4].value PagesCount = $_.Properties[7].value } } $events | select userid, printer ,pagescount
      
      







スクリプトの結果。







さらに、単一のプリントサーバーのパフォーマンスを最適化するジョブを実行し、クラスター内のプリンターを組み合わせることができます。 一般に、好きなように楽しんでください-少なくともSNMP経由でプリンターを監視し、カートリッジがなくなる前に従業員に通知してください。







プリンターをユーザーに接続することに移りましょう。複雑であまり良い選択肢ではありません。







入力でプリンターを接続します



ログオンスクリプトの使用は古く実績のあるツールであり、いつでもどこでも動作します。 ユーザーがログインすると、目的のプリンターを接続してデフォルトで設定するスクリプトがトリガーされます。すべてがシンプルで安定しています。 cmdでは、スクリプトは次のようになります。







 rundll32 printui.dll,PrintUIEntry /in /n\\servername\printername /y
      
      





プリンターを操作するためのcmdコマンドの詳細については、 Microsoftの資料を参照してください







vbsのファンは既にオブジェクトを使用する必要があり、プリンター接続は次のようになります。







 On Error Resume Next Set WshNetwork = CreateObject("WScript.Network") WshNetwork.AddWindowsPrinterConnection "\\servername\printername" WshNetwork.SetDefaultPrinter "\\servername\printername"
      
      





同様に、タスクはPowerShellで解決されます。







 $net = new-object -com wscript.network $net.AddWindowsPrinterConnection("\\servername\printername") $net.SetDefaultPrinter("\\servername\printername")
      
      





TechNet WshNetwork ObjectWscript.Network com-interfaceの機能、およびPowerShellを使用したプリンターの管理について読むことができます。PowerShellWorking with Printers documentationセクション参照してください。







プリンターを接続するだけですべてが簡単な場合(ドライバーのみがコンピューター上にある場合)、プリンターの選択的な接続にはアーキテクチャ上の工夫が必要になります。 管理アクティビティの広大な範囲で見つかったいくつかのオプションを提供します。







各プリンタには独自のセキュリティグループがあります。 彼女だけがそのプロパティでプリンタに印刷することができます。 各セキュリティグループには、独自のログオンスクリプトと、セキュリティフィルターを備えた独自のグループポリシーがあります。









より多くのグループポリシーが必要です。







このオプションは悪くありませんが、新しいプリンターを追加するときは、新しいセキュリティグループ、新しいグループポリシー、および接続用の新しいスクリプトを作成する必要があります。 もちろん、これは「テンプレートへの没入とWindows GPOの使いこなし 」という資料の助けを借りずに自動化することはできますが、ソリューションはまだ最もエレガントに見えません。







別のオプションは、ユーザーまたはコンピューターの属性をチェックし、それに応じて目的のプリンターを接続する単一のスクリプトを作成することです。 属性は、場所、説明、またはセキュリティグループのメンバーシップです。







属性とプリンター名の対応は、スクリプトの本文にハードコードされるか、テキストファイルやSQLテーブルなどの外部データソースに書き込まれます。 このオプションは、メンテナンスが少し簡単です-この場合、編集する必要があるのは1つのスクリプトまたは外部データソースのみです。







ネタバレの下で、vbsで同様のスクリプトのバリアントを提供します。
 Set WshShell = WScript.CreateObject("WScript.Shell") Set objSysInfo = CreateObject("ADSystemInfo") strComputer = "." Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") strUserDN = objSysInfo.userName Set UserObj = GetObject("LDAP://" & strUserDN) '      ' iGroup = 0 For Each GroupObj In UserObj.Groups iGroup = iGroup + 1 Redim Preserve strArrayUserGroups(iGroup) strArrayUserGroups(iGroup) = Replace(GroupObj.Name, "CN=", "") Next '    ' For i = 1 To iGroup AddPrintersByGroup strArrayUserGroups(i) Next Function AddPrintersByGroup (strGroup) Set WshNetwork = CreateObject("WScript.Network") Select Case strGroup Case "Add Printer HP2055BUH2" WshNetwork.AddWindowsPrinterConnection "\\servername\HP2055BUH2" WshNetwork.SetDefaultPrinter "\\servername\HP2055BUH2" Case "Add Printer HP2055HR" WshNetwork.AddWindowsPrinterConnection "\\servername\HP2055HR" WshNetwork.SetDefaultPrinter "\\servername\HP2055HR" ... End Select End Function
      
      





他のポリシーのみが、プリンターを接続するためのより良いポリシーになります。



グループポリシーの基本設定またはグループポリシーの基本設定の出現により、スクリプトなしで行うことが可能になりました。 実際、プリンターへの接続は、「ユーザー構成-設定-コントロールパネル-プリンター」セクションで構成できます。









新しいプリンターまたは古いプリンターに接続します。







同時に、[全般設定]タブの[ターゲット設定]ツールを使用して、ドメイン内のプリンター数のポリシーを構成する必要はありません。 実際、このツールはグループポリシーのwmiフィルターに似ていますが、フィルターに加えて事前定義されたオプションセットのみがあります。









可能なターゲティングオプション。







セキュリティグループごとにフィルターを構成することをお勧めします。 その後、必要な数のセキュリティグループを作成し、プリントサーバー上のプリンターのアクセス許可を構成し、これらのプリンターをグループポリシーに入れるだけで十分です。







追加変更を自動化する場合、グループポリシーの基本設定自体が[基本設定]サブフォルダーのグループポリシーフォルダーにあるという事実を使用できます。 プリンターの場合、これはPrintersサブフォルダーのPrinters.xml xmlファイルになります。









プリンター設定の物理的な場所。







開くと、xml構造が非常に単純であることがわかります。







 <?xml version="1.0" encoding="utf-8"?> <Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}"> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="HP2055BUH2" status="HP2055BUH2" image="2" bypassErrors="1" changed="2018-03-21 13:47:25" uid="{9E6F08F9-1C6B-49EB-A985-25A722ADD9C1}"> <Properties action="U" comment="" path="\\servername\HP2055BUH2" location="" default="0" skipLocal="0" deleteAll="0" persistent="0" deleteMaps="0" port=""/> <Filters> <FilterGroup name="Domainname\Printer_Add_2055_Buh" localGroup="0" primaryGroup="0" userContext="1" sid="" not="0" bool="AND"/> </Filters> </SharedPrinter> </Printers>
      
      





必要に応じて、手動またはスクリプトを使用して、パラメータを慎重に追加/変更できます。 もちろん、XMLでホイールを再発明し、洗っていない手をスクラブするのは楽しくて楽しいですが、まったく必要ありません-TechNetスクリプトギャラリーには、セキュリティグループに焦点を当てたグループポリシーにプリンターを追加する既製のAdd-Printer-IN-GPOスクリプトが既にあります。







記事の最後で、どういうわけか実装しなければならなかった1つの興味深い方法について説明します。







奇妙な接続方法の貯金箱へ-スケジュールされたタスク



顧客からタスクを受け取りました-プリンターをユーザーに自動的に接続するツールを作成します。 同時に、反応時間は最小限に抑える必要があり、ログインは許可されないため、ログオンスクリプトやグループポリシーなどの従来のオプションはすぐに却下されました。







ニュアンスは、ユーザーがファーム内で、ファームなしでターミナルサーバーで作業したことです。 フィクションの目標はcであるため、異なるセッションでリモートコンピューターでコマンドを実行するための可能なオプションを思い出さなければなりませんでした-一部のオプションについては、記事「1000 ++でコマンドをリモートコンピューターで実行する 」 最適なオプションは、割り当てられたタスクを使用することでした。







私はバッチファイルが大好きで、PowerShellを使用せずにできるときに使用するため、cmdを排他的に使用して問題を解決しました。







主な問題は、ユーザーのセッションでプリンターを直接接続するコマンドを実行する必要があり、パスワードを知らないため、通常の方法はあまり効果的ではなかったということです。 このために、このコマンドを使用してスケジュールされたタスクを作成するときに、ユーザー名を設定する機会を使用しました。







 schtasks /create /S computername /SC ONCE /ST 00:00 /RU domain\username /TN taskname /tr "rundll32 printui.dll,PrintUIEntry /in /nPrintername"
      
      





2番目の問題は、呼び出し時にユーザーが作業していたコンピューターを見つけることでした。 テキストファイルでqwinstaユーティリティと使用可能なコンピューターのリストを使用しました。 もちろん、他の方法もあります。たとえば、Active Directory属性またはテキストファイルからコンピューター名を取得する方法です。 ただし、この手順には追加のログオンスクリプトが必要です。 実装の例として、 方法:Active Directoryでログオンしているユーザーのコンピューター名を表示する方法をアドバイスできます。







その結果、ユーザー名と接続されたプリンターをパラメーターとして使用するスクリプトが登場しました。 スクリプトの横に、ユーザーが作業できるサーバーのリストを含むテキストファイルを配置します。







ネタバレの下にあるスクリプトの完全なリスト。
 @echo off rem     ... for /F %%i in (servers.txt) do ( rem    qwinsta /SERVER %%i | find "%1" && call :subroutine %%i %1 %2 ) GOTO :EOF :subroutine rem C   schtasks /create /S %1 /SC ONCE /ST 00:00 /RU domain\%2 /TN printer_%2 /tr "rundll32 printui.dll,PrintUIEntry /in /n%3" rem   schtasks /run /S %1 /TN printer_%2 rem   schtasks /delete /S %1 /TN printer_%2 /F GOTO :EOF
      
      





もちろん、ユーザー自身が目的のプリンターに接続し、デフォルトでそれを選択し、そのためのITサービスをプルしないことができる会社があります。 残念ながら、すべてがそれほど高度なわけではありません。







コメントで、組織内のネットワークプリンターとその管理との関係を共有することをお勧めします。








All Articles