通過 GPO/GPP 部署列印機 - 是否有程式選項?
由於我無法控制的原因,我的任務是設置 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>