如何在没有用户干预的情况下删除打印机连接?

如何在没有用户干预的情况下删除打印机连接?

情况是这样的:我们将用较新的型号替换 11 台打印机,并将它们安装在我们的打印服务器上并共享。计划是使用与它们要替换的打印机不同的名称来共享新打印机,并取消共享旧打印机。

所以我需要想出一种方法来自动删除与旧打印机的客户端连接。客户端大多是 Windows 7,还有少数是 XP。

我的第一个想法是从登录脚本调用prnmngr.vbs,通过名称明确删除每台旧打印机。问题是有些用户在一天的工作结束后不会注销,所以我不能指望他们的登录脚本在他们下次需要打印之前运行。我可以prnmngr.vbs使用 SCCM 远程运行,但如果它没有“模仿”用户,我认为它不会删除他们的打印机。有什么想法吗?我能否查找如何使用 c# 代码访问 WMI 并编写一个“特洛伊木马”来删除特定打印机而无需用户执行任何操作?(我只是半开玩笑)。

我愿意接受任何建议!谢谢!

答案1

组策略打印机首选项包含“删除”选项。如果您使用 GPP GPO 部署新打印机,则可以将删除项添加到其末尾,或创建一个全新的Delete PrintersGPO。

我刚刚对大约 75 台打印机进行了类似的转换,一切进展顺利。我们有一个Deploy PrintersGPO 链接在域级别,其中包含所有打印机,并且映射通过使用项目级别定位的组成员身份进行控制。我们还有一个Deleted Printers域级别的 GPO,其中包含旧打印服务器上的所有旧打印机。我没有费心过滤它,因为真的没有必要。如果它是旧的并且已映射,就必须删除它!

GPP 项目的优点在于它们按策略刷新间隔运行,这意味着无需登录/注销/重新启动。只需配置策略、链接它,然后就可以了。无需处理脚本或 WMI 或任何此类内容。

答案2

实际上移除打印机是比较容易的部分

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colInstalledPrinters = objWMIService.ExecQuery _
    ("Select * From Win32_Printer Where Network = True")

For Each objPrinter in colInstalledPrinters
    objPrinter.Delete_
Next

困难(或至少是令人头疼)的部分是将其推送给所有用户,而无需他们执行任何操作(例如重新启动)。坦率地说,我的解决方案是发送一封电子邮件,告诉用户重新启动以映射新打印机。这样,您可以Run Once通过 GPO 将打印机删除脚本放入注册表设置中,然后通过 GPP 映射新打印机。

如果您拥有一个较小或组织良好的环境,您可以始终运行一个脚本,使用 psexec 将其推送到所有用户工作站(需要一个.csv或其他带有工作站列表的分隔文本文件),但同样,这似乎更麻烦,我更倾向于告诉用户重新启动。

相关内容