web-dev-qa-db-ja.com

GPO / GPPを介したプリンターの展開-プログラムによるオプションはありますか?

私の制御が及ばない理由で、私はGPO/GPPをセットアップして100以上のプリンターを1000以上のクライアントに展開することを任されています。

良いニュースは、12を超えるサイトがあり、ほとんどの場合、サイトXのすべてのプリンターをサイトXのすべてのクライアントPCにプッシュアウトすることが許可されていることです。

悪い知らせは、私がそれを行う方法を知っている2つの方法( "グループポリシーで展開..."、プリントサーバーから) "GPP /グループポリシーの基本設定を使用する )には、これだけ多くのプリンタを使用するよりも、はるかに多くの手動作業が必要です。すべてを選択することすらできません。プリントサーバー上のプリンタとDeploy with Group Policy...オプション、たとえば-それは私がそれを1つずつ行うことを期待していますが、これは起こりません。印刷サーバーからプリンターのパスを選択し、プリンター接続から取得できるはずの一連の情報(プリンターIPなど)を手動でパンチする必要があるため、GPPはさらに悪いものです。

プリントサーバーのすべてのプリンターをGPO/GPPに追加するスクリプトのGoogle-Fuが空になり、これを半自動化する別の方法が見当たらないようですが、私は固執しています私は何かが足りないという信念を持っており、何人かの正気な人がGPOに数百のプリンターを手動で追加することを選択する方法はないからです。

理想的には、GPPをプログラムで使用する方法を見つけたいと思いますが、この状況では、手動でプリンターを追加するのに数十時間もかからない解決策がすばらしいでしょう。

誰かがこれを行う方法を持っていますか、または私はPowerShellスクリプトを作成するか、および/またはこれを行うように部下をだます必要がありますか?

10
HopelessN00b

私はかなり一生懸命ググった、そしてbackup-GPO結果のXMLファイルをハッキングして再インポートできることを期待していますが、PowerShellスクリプトが将来あると思います。

それは悪いことではありません。最も近いサーバーからプリンターリストを生成し、それをループしてマップすることができます。

このようなもの:

$net = New-Object -COMObject WScript.Network
$printserver = 'yourserver'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist) 
{
    $printerpath = '\\' + $printserver + '\' + $printer.ShareName
    #echo $printerpath
    $net.AddWindowsPrinterConnection($printerpath)
}

プリンターに論理的な名前が付けられていて、マシンを識別するための論理的な方法がある場合は、さらに調整できる可能性があります。たとえば、クライアントのIPアドレスの取得に基づいて、最も近いサーバーを選択していました。 10.20。*のようなIPアドレスの場合、server1に移動します。等。

お役に立てば幸いです。

編集:

@EvanAndersonのドキュメントを見ると、XMLがハッキング可能であると確信しています。

エクスポートされたファイルの関連ビット(編集を含む):

<DSObject bkp:Path="CN={GUIDHERE},CN=PushedPrinterConnections,%GPO_MACH_DSPATH%" bkp:SourceExpandedPath="CN={13B9B596-452C-4652-A05D-78EF06610134},CN=PushedPrinterConnections,CN=Machine,CN={44A99FBA-0DB3-484C-808E-3DDAE9932A2B},CN=Policies,CN=System,DC=Domainname,DC=extension" bkp:ObjectClass="msPrint-ConnectionPolicy">
    <DSAttributeMultiString bkp:DSAttrName="showInAdvancedViewOnly">
        <DSValue><![CDATA[TRUE]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="uNCName">
        <DSValue><![CDATA[\\Servername\PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="serverName">
        <DSValue><![CDATA[\\Servername]]></DSValue></DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printAttributes">
        <DSValue><![CDATA[0]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printerName">
        <DSValue><![CDATA[PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
</DSObject>
7

私の意見では、グループポリシーのPowershell管理sucksサードパーティ(商用)製品なし。

あなたが探していることを実行するために、グループポリシーオブジェクトで XMLを使ったスリング (または 必要に応じてHTML )で行き詰まっていると思います。

幸いなことに XMLはそれほど恐ろしく見えません 。プリンターごとのUID値(@KatherineVillyardが彼女のコメントで参照しているものだと思います)は、ランダムにGUIDがXMLで参照されているプリンターごとに生成されます。

以下は、キャサリンのコードを恥ずかしくない形でモデル化したPowershellコードのサンプルです。

@"
<?xml version="1.0" encoding="utf-8"?>
<Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}" disabled="0">
"@

$net = New-Object -COMObject WScript.Network
$printserver = 'print-server'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist) 
{
    $date = Get-Date
    echo '  <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}"'
    '    name="' + $printer.ShareName + '"' | echo
    '    status="' + $printer.ShareName + '"' | echo
    echo '    image="2"'
    '    changed="' + $date + '"' | echo
    $ng = [GUID]::NewGuid().ToString('B')
    '    uid="' + $ng + '">' | echo

    echo '    <Properties'
    echo '      action="R"'
    echo '      comment=""'
    '      path="\\' + $printserver + '\' + $printer.ShareName + '"' | echo
    echo '      location=""'
    echo '      default="1"' 
    echo '      skipLocal="1"'
    echo '      deleteAll="0"'
    echo '      persistent="0"'
    echo '      deleteMaps="0"'
    echo '      port=""/>'
    echo '  </SharedPrinter>'
}

@"
</Printers>
"@

(私は本当に、本当に醜いPowershellコードを書いています。)

GPP CSEでこのXMLを解析することは実際には試みていません。 XMLは少なくとも検証します。

Get-GPOを使用していくつかの怪物を書き、GUIDを解析して、GPO SYSVOLですが、今晩は実際の作業を行う必要があるので、読者のための練習問題として残しておきたいと思います。

8
Evan Anderson

私は最近同様のプロジェクトに着手し、良い方法を検討した後、GPOプッシュメソッドと新しいGPPとスクリプトの比較、すべてをスクリプト化することを選択しました。あなたが、ここにあなたのためのいくつかのポインタがあります:

  • 理想的には、新しいOS(Windows 8/2012 +)のクライアントを使用してプリントサーバーに接続し、プリントサーバーからプリンター情報を取得します。

    Get-Printer -computer PrintServerName

  • ADセキュリティグループを使用して、印刷キューをコンピューターにマップします。たとえば、\ PrintServer1\MyColorPrinter123という名前の印刷キュー(上記のコマンドから収集したもの)があり、printer.group.PrintServer1.MyColorPrinter123のようなセキュリティグループを作成して、そのグループにコンピューターを追加するとします。

  • 起動スクリプトに、起動時にコンピューターのグループメンバーシップを確認し、それがプリンターグループの一部であるかどうかを確認する機能があります。の場合は、組み込みのprintui.exe(またはprintui.dll)コマンドを使用して、次のようにプリンターをマップします。

    呼び出し式 'rundll32 printui.dll、PrintUIEntry/ga/n "\ PrintServer1\MyColorPrinter123"/q'

  • コンピューターが起動すると、その印刷スプーラーサービスは、GPOが使用していた「印刷接続」を、ログインするユーザーにプッシュします。

もっと詳細に進むことができます**が、高レベルではそれが必要です。

**ユーザー(実際には技術者)が任意のプリントサーバーを選択できるGUIを作成しました。これにより、そのサーバー上のプリンターのリストが表示されます。 1つを選択すると、そのすべてのプロパティを表示できます。その情報は、前述のGet-Printerからのものです。そのデータをcsvとしてエクスポートした場合、そのデータを再利用して情報を表示できます。

**技術者はそのGUIを使用して、接続するはずのプリンターにコンピューターを追加する要求を送信します。これは「リクエスト」であり、b/c ADでの権限がありません。

**単純なバックエンドスクリプトがフォルダーを監視し、コンピューターを上記のプリンターグループに追加します。したがって、誰がどのプリンタを取得する必要があるかをすでに知っている場合は、簡単にそれを実行できます。グループへのコンピューターの追加は、ADコマンドレットを使用した簡単な作業です。

**ジョブをスケジュールして、プリントサーバーをチェックして新しい印刷キューがあるかどうかを確認し、ADグループと比較することもできます。

したがって、「管理された」ソリューションの作成は少し複雑ですが、基本から始めて、GPOを含まない非常に柔軟で使いやすいシステムを追加することは簡単です...ほんの少しのPowerShell

0
Adil Hindistan