AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 576217
Accepted
HopelessN00b
HopelessN00b
Asked: 2014-02-18 08:46:52 +0800 CST2014-02-18 08:46:52 +0800 CST 2014-02-18 08:46:52 +0800 CST

通过 GPO/GPP 部署打印机 - 是否有编程选项?

  • 772

由于我无法控制的原因,我的任务是设置 GPO/GPP 以将我们的 100 多台打印机部署到我们的 1000 多个客户。

好消息是我们有十几个站点,而且在大多数情况下,我被允许将站点 X 的所有打印机推送到站点 X 的所有客户端 PC。

坏消息是我知道如何做到这一点的两种方法(“使用组策略部署...”,从打印服务器“和使用 GPP/组策略首选项)涉及的手动工作比我愿意做的要多得多这么多打印机。我什至无法选择打印服务器上的所有打印机并使用该Deploy with Group Policy...选项,例如 - 它希望我一个一个地做到这一点,这不会发生。GPP 甚至更糟,因为它希望我从打印服务器中选择打印机的路径,然后手动输入应该能够从打印机连接中获取的一堆信息(例如打印机 IP)。

我的 Google-Fu 用于将打印服务器上的所有打印机添加到 GPO/GPP 的脚本是空的,我似乎看不到另一种方法可以以半自动化的方式执行此操作,但我坚持相信我遗漏了一些东西,因为任何理智的人都不会选择手动将数百台打印机添加到 GPO 中。

理想情况下,我想找到一种编程方式来使用 GPP,但在这种情况下,任何不涉及数十小时手动添加打印机的解决方案都会很棒。

有没有人有办法做到这一点,还是我需要构建一个 PowerShell 脚本和/或欺骗下属这样做?

active-directory
  • 3 3 个回答
  • 6865 Views

3 个回答

  • Voted
  1. Evan Anderson
    2014-02-18T15:43:13+08:002014-02-18T15:43:13+08:00

    在我看来,组策略的 Powershell 管理很糟糕,没有第三方(商业)产品。

    我认为您被困在组策略对象中的 XML(或HTML,如果您愿意)来做您正在寻找的事情。

    幸运的是,XML 看起来并不那么可怕。每个打印机的 UID 值(我相信这是@KatherineVillyard 在她的评论中所指的)只是为 XML 中引用的每台打印机生成的随机 GUID。

    这是一些示例 Powershell 代码,无耻地模仿 Katherine 的代码:

    @"
    <?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 以获取 SYSVOL 中 GPO 的文件系统路径,但考虑到我今晚需要做一些真正的工作,我想我要离开了作为读者的练习。>smile< 不过,这应该是非常可行的。

    • 8
  2. Best Answer
    Katherine Villyard
    2014-02-18T15:24:05+08:002014-02-18T15:24:05+08:00

    我用谷歌搜索得很辛苦,甚至玩弄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>
    
    • 7
  3. Adil Hindistan
    2014-02-18T19:48:42+08:002014-02-18T19:48:42+08:00

    我最近进行了一个类似的项目,在研究了优秀的 GPO 推送方法与较新的 GPP 与脚本之后,我选择为整个事情编写脚本。我不知道什么最适合你,但这里有几个指针给你:

    • 理想情况下,使用具有新操作系统(Windows 8/2012+)的客户端连接到打印服务器并从打印服务器获取打印机信息:

      获取-打印机-计算机 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 Cmdlet 将计算机添加到组是一项简单的工作。

    ** 您还可以安排一个作业来检查打印服务器以查看是否有任何新的打印队列,并将它们与您的 AD 组进行比较。

    因此,创建一个“托管”解决方案有点复杂,但从基础开始并继续添加以拥有一个非常灵活、易于使用且不涉及 GPO 的系统很容易......只是有点 PowerShell

    • 1

相关问题

  • 如果以域用户身份远程登录,PC 速度极慢

  • 如何在 Windows 2003 的 ou 级别应用策略

  • 允许用户更改其 Active Directory 密码的 Web 界面

  • MOSS 2007 无法使用 ActiveDirectoryMembershipProvider 配置表单身份验证

  • 通过 VPN 更改 Active Directory 密码

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve