情况是这样的:我们将用较新的型号替换 11 台打印机,并将它们安装在我们的打印服务器上并共享。计划是使用与它们要替换的打印机不同的名称来共享新打印机,并取消共享旧打印机。
所以我需要想出一种方法来自动删除与旧打印机的客户端连接。客户端大多是 Windows 7,还有少数是 XP。
我的第一个想法是从登录脚本调用prnmngr.vbs
,通过名称明确删除每台旧打印机。问题是有些用户在一天的工作结束后不会注销,所以我不能指望他们的登录脚本在他们下次需要打印之前运行。我可以prnmngr.vbs
使用 SCCM 远程运行,但如果它没有“模仿”用户,我认为它不会删除他们的打印机。有什么想法吗?我能否查找如何使用 c# 代码访问 WMI 并编写一个“特洛伊木马”来删除特定打印机而无需用户执行任何操作?(我只是半开玩笑)。
我愿意接受任何建议!谢谢!
答案1
组策略打印机首选项包含“删除”选项。如果您使用 GPP GPO 部署新打印机,则可以将删除项添加到其末尾,或创建一个全新的Delete Printers
GPO。
我刚刚对大约 75 台打印机进行了类似的转换,一切进展顺利。我们有一个Deploy Printers
GPO 链接在域级别,其中包含所有打印机,并且映射通过使用项目级别定位的组成员身份进行控制。我们还有一个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
或其他带有工作站列表的分隔文本文件),但同样,这似乎更麻烦,我更倾向于告诉用户重新启动。