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


10

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

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

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

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

理想的には、GPPをプログラムで使用する方法を見つけたいと思いますが、この状況では、プリンタを手動で数十時間追加することを必要としないソリューションが最適です。

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


1
今日のチャットでお話ししたように、プログラムでGPOを作成してリンクするためのCOMインターフェイスがあります$GPM = New-Object -ComObject GPMgmt.Gpm。インターフェースは、絶対的なピッグでありながら、実際のGPOのように見えたり臭いがしたりするXMLを単純にハッキングするよりも、少しサポートしやすい方法を提供していると思います。COMが好きな人はいません。私たちのすべてのPowershellersの少なくとも。
Ryan Ries 14

1
@RyanRiesはい、私はまだ頭の中でそれを蹴っています。私が決めていないことの1つは、私のクリップがサポート可能である必要があるかどうか、またはそれを設定するために一度だけのものです最初の場所。結局ここに投稿します。
HopelessN00b 2014

100台のプリンターを展開する必要があると言っても、すべてのコンピューター(1..1000)に100台のプリンターをすべて搭載する必要があるという意味ではありませんよね?
アディルヒンディスタン2014

1
@AdilHindistanいいえ。各コンピュータは、そのサイトで利用可能なすべてのプリンタを取得する必要があります。(多かれ少なかれ。)しかし、それらを分離することは難しい部分ではありません。本来、プリンターをGPOに取り込んでいるため、思った以上に苦痛であることが判明しています。
HopelessN00b 2014

回答:


7

私はかなり一生懸命ググって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>

これは良い答えです(そして、私は最終的にこのようなものを使用して締め切りに間に合う可能性があります)が、実際にはGPO / GPPを使用してある時点でプリンタ。そして、PSログオンスクリプトは技術的にその要件に適合しますが、経営陣が私に集中して、そのようにそれを行うのに私の価値がないようにすることを期待しています。
HopelessN00b 2014

ああ。。:( GPOは、コマンドレットは、GPOの追加、バックアップ、復元、空白のオブジェクトを作成して...ではなくているように見えるプリンタ政策が見えていたXMLオブジェクトPowerShellの完全。GUIDを除きハッキング
キャサリンVillyard

1
ええ、サードパーティのツールがなければ、PowerShellによるGPO / GPPの自動化はかなり苦痛です。 私はかなり見栄えの良いものを見つけました、それはおそらく私たちが購入することを許可されていないサードパーティのソフトウェアスイートを必要とするという事実を除いて...それでおそらく既存のサイト固有のXMLを編集するためのあなたのようなスクリプトになるでしょうGPO ...完了したらここに投稿すると思います。
HopelessN00b 2014

8

グループポリシーのPowerShellの管理は吸う私の意見では、サードパーティ(商用)製品O / W。

グループポリシーオブジェクトのXML(または必要に応じてHTML)を探して、探していることを実行するのが難しいと思います。

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

以下は、キャサリンのコードを恥ずかしくない形でモデル化した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-GPOSYSVOLでGPOのファイルシステムパスに到達するためにGUIDを使用して構文解析を行うことで、いくつかの怪物を書くことを考え始めていますが、今夜は実際の作業を行う必要があることを考えると、去るつもりです。それは読者のための練習として。> smile <しかし、それは実現可能性が高いはずです。


ランダムなGUIDであれば、間違いなくハッキング可能です。私も更新しました。へえ。
Katherine Villyard、2014

グループポリシーのバックアップでXMLを変更することは確かに機能しますが、SYSVOLで「ライブ」に変更することも可能です(一方が勇敢で愚かであるか、または私のように両方である場合)。私は今晩行うべき本当の仕事があるので(そして今四半期も担当者ランキングで@ewwhiteに戻ってきたので)、その特定の銃をロードして他の誰かのために彼らの足元に向けるのを省くと思います。> giggle <
エヴァンアンダーソン

私は勇敢ですが、私はそれほど勇敢ではありません。;)ファイルの生成、テスト環境へのインポートのテストなど
Katherine Villyard '18 / 02/18

2
Powershellには、さらに多くのGPOオプションが必要です。Get-Link、Set-Link、New-GPO、およびSet-GPORegistryは本当に十分ではありません...
マークヘンダーソン

組み込みのPowerShellコマンドでは不十分な場合があります。その場合、「GPOガイのソリューション」を確認することをお勧めします。彼は会社を持っています:sdmsoftware.com
Adil

0

私は最近同様のプロジェクトに着手し、古い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を作成しました。これにより、そのサーバー上のプリンターのリストが表示されます。いずれかを選択すると、そのすべてのプロパティを表示できます。その情報は、前述のGet-Printerからのものです。そのデータをcsvとしてエクスポートすると、情報を表示するために再利用できます。

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.