使用以下代码,我可以找到并删除打印队列
Dim scope = New ManagementScope(ManagementPath.DefaultPath)
scope.Connect()
Dim printers = New ManagementObjectSearcher(scope, New SelectQuery("Select * from Win32_Printer Where Network = TRUE")).[Get]()
MsgBox("Print count: " & printers.Count)
For Each printer As ManagementObject In printers
Dim nameOfPrinter = printer("Name").ToString()
If nameOfPrinter.Contains("BROTHER") OrElse nameOfPrinter.Contains("HP") Then
printer.Delete()
End If
Next
但是,当我将代码移动到installer.vb(作为主输出(活动)添加到安装程序项目中)时,将返回printers.count 0
更新:如果我删除了原因,我可以获取本地打印队列
<Security.Permissions.SecurityPermission(Security.Permissions.SecurityAction.Demand)> _
Public Overrides Sub Commit(ByVal savedState As _
System.Collections.IDictionary)
Dim scope = New ManagementScope(ManagementPath.DefaultPath)
scope.Connect()
Dim printers = New ManagementObjectSearcher(scope, New SelectQuery("Select * from Win32_Printer Where Network = TRUE")).[Get]()
MsgBox("Print count: " & printers.Count)
For Each printer As ManagementObject In printers
Dim nameOfPrinter = printer("Name").ToString()
If nameOfPrinter.Contains("BROTHER") OrElse nameOfPrinter.Contains("HP") Then
printer.Delete()
End If
Next
有什么我想错过的吗?请指教,谢谢。
答案 0 :(得分:0)
最可能的解释是网络资源打印机(以及映射驱动器号等其他网络项)特定于用户上下文。在为Everyone运行的Visual Studio安装程序中,自定义操作与本地系统帐户一起运行(升级它们是必需的),因此无法找到它们。您询问系统帐户是否有任何网络打印机(并且系统帐户无论如何都没有网络访问权限)。它找到硬连线的本地打印机,因为它们可供所有用户使用。
在Visual Studio设置中,这并没有很好地绕道而行。您通常会使用在应用程序首次运行时运行的配置程序来实现您正在执行的操作。我不清楚为什么要在安装过程中删除打印队列,但是如果它可能需要多次完成,那么用户可以在以后重新运行该程序,并且也许如果安装后安装了那种类型的打印机,可能需要重新配置。
答案 1 :(得分:0)
是的,您无法从“Select * from Win32_Printer Where Network = TRUE”中检索打印机,因为您正在为计算机的所有用户安装安装程序,但是,您将网络打印机共享给特定用户。我解决了这个问题,只需使用“运行”将网络打印机共享给所有用户即可。
简单来说, 转到“运行”(winkey + R) 并输入 rundll32 printui.dll,PrintUIEntry /ga /n\servername\printername (请相应地替换服务器名和打印机名。 例如:- rundll32 printui.dll,PrintUIEntry /ga /n\100.100.161.48\EPSON LX -310 ESC/P) 并单击“确定”。然后重启电脑。
打印机将添加到所有用户,现在您可以从“Select * from Win32_Printer Where Network = TRUE”中检索网络打印机。
我希望这会有所帮助。