由于我无法控制的原因,我负责设立GPO / GPP,为我们的1000多个客户部署我们的100多台打印机。
好消息是,我们有十几个站点,而且大多数情况下,我可以将站点X的所有打印机推送到站点X的所有客户端PC。
坏消息是,我知道如何做的两种方式( “使用组策略进行部署…”, 使用GPP /组策略首选项 )涉及的手动工作比我愿意的要多得多我甚至无法select打印服务器上的所有打印机,并使用“ Deploy with Group Policy...选项,例如,我希望我可以一个接一个地完成这个任务GPP更糟糕,因为它期望我从打印服务器中select打印机的path,然后手动打印一些应该能够从打印机连接中获得的信息(如打印机IP)。
我的Google-Fu用于将打印服务器上的所有打印机添加到GPO / GPP的脚本已经空了,而且我似乎还没有看到用半自动化的方式来做这件事的另一种方法,但是我坚持相信我错过了一些东西,因为没有任何理智的人会select手动将数百台打印机添加到GPO中。
理想情况下,我想find一个使用GPP的程序化方法,但是在这种情况下,任何不需要几十个小时手动添加打印机的解决scheme都会很棒。
有没有人有办法做到这一点,或者我需要build立一个PowerShell脚本和/或欺骗下属这样做?
我很努力地search,甚至玩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地址来select最近的服务器。 如果IP地址如10.20。*,则转到server1。 等等。
我希望有帮助。
编辑:
看@埃文安德森的文档,我很确定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>
在我看来,组策略的Powershellpipe理吸引没有第三方(商业)产品。
我认为你在组策略对象中使用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 CSEparsing这个XML。 XML至less可以validation。
我开始考虑使用Get-GPO编写一些怪物,并parsing出GUID以便到达SYSVOL中GPO的文件系统path,但是鉴于今天晚上我需要做一些真正的工作,我想我是将作为读者的练习离开。 >微笑<这应该是非常可行的,虽然。
我最近进行了一个类似的项目,在考察了好的GPO推送方法和新的GPP对比脚本之后,我select了编写整个脚本。 我不知道最适合你的是什么,但这里有几个指针:
理想情况下,使用带有新操作系统(Windows 8/2012 +)的客户端连接到打印服务器,并从打印服务器获取打印机信息:
Get-Printer -computer PrintServerName
使用AD安全组将映射打印队列到计算机。 假设您有一个名为\ PrintServer1 \ MyColorPrinter123的打印队列(您从上面的命令中收集到的)创build一个安全组,如printer.group.PrintServer1.MyColorPrinter123,然后将这些计算机添加到该组
在启动脚本中,有一个function来检查计算机启动时的组成员身份,并查看它是否是任何打印机组的一部分。 如果是,请使用内置的printui.exe(或printui.dll)命令来映射打印机
Invoke-Expression“rundll32 printui.dll,PrintUIEntry / ga / n”\ PrintServer1 \ MyColorPrinter123“/ q'
一旦计算机启动后,打印后台处理程序服务会将“打印连接”(这是GPO使用的打印连接)推送给任何要login的用户。
你可以去更详细的**,但在高层次,这是需要的。
**我创build了一个允许用户(技术人员)select任何打印服务器的GUI,并给出了该服务器上的打印机列表。 如果他们select一个,他们可以看到它的所有属性。 这个信息来自上面提到的Get-Printer。 如果您将该数据导出为csv,则可以重新使用它来显示信息。
**技术人员使用该GUI来发送请求,将计算机添加到应该连接的打印机。 这是一个'请求',B / C他们没有在AD的权限。
**一个简单的后台脚本监视文件夹,并将计算机添加到我上面提到的打印机组。 所以,如果你已经知道谁应该得到哪台打印机,那么很好,你可以轻松做到。 将计算机添加到组是AD Cmdlet的一项简单工作。
**您也可以安排一项工作来检查打印服务器,看是否有新的打印队列,并将它们与您的AD组进行比较。
因此,创build一个“托pipe”的解决scheme是有点涉及的,但是从基础开始很容易,并且不断增加一个非弹性的,易于使用的系统,不涉及GPO …只是有点PowerShell