Active-Directory

通過 GPO/GPP 部署列印機 - 是否有程式選項?

  • February 18, 2014

由於我無法控制的原因,我的任務是設置 GPO/GPP 以將我們的 100 多台列印機部署到我們的 1000 多個客戶。

好消息是我們有十幾個站點,而且在大多數情況下,我被允許將站點 X 的所有列印機推送到站點 X 的所有客戶端 PC。

壞消息是我知道如何做到這一點的兩種方法(“使用組策略部署…”,從列印伺服器“使用 GPP/組策略首選項)涉及的手動工作比我願意做的要多得多這麼多列印機。我什至無法選擇列印伺服器上的所有列印機並使用該Deploy with Group Policy...選項,例如 - 它希望我一個一個地做到這一點,這不會發生。GPP 甚至更糟,因為它希望我從列印伺服器中選擇列印機的路徑,然後手動輸入應該能夠從列印機連接中獲取的一堆資訊(例如列印機 IP)。

我的 Google-Fu 用於將列印伺服器上的所有列印機添加到 GPO/GPP 的腳本是空的,我似乎看不到另一種方法可以以半自動化的方式執行此操作,但我堅持相信我遺漏了一些東西,因為任何理智的人都不會選​​擇手動將數百台列印機添加到 GPO 中。

理想情況下,我想找到一種程式方式來使用 GPP,但在這種情況下,任何不涉及數十小時手動添加列印機的解決方案都會很棒。

有沒有人有辦法做到這一點,還是我需要建構一個 PowerShell 腳本和/或欺騙下屬這樣做?

我用Google搜尋得很辛苦,甚至玩弄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 地址來選擇最近的伺服器。如果 IP 地址如 10.20.*,請轉到 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>

引用自:https://serverfault.com/questions/576217