2016-10-13 7 views
0

Используя следующий код, я могу найти и удалить из очереди печати«Win32_Printer Где Network = TRUE» не возвращают результат в Visual Studio инсталлятор проекта

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

Наиболее вероятным объяснением является то, что принтеры сетевых ресурсов (и другие сетевые элементы, такие как сопоставленные буквы дисков) специфичны для контекста пользователя. В настройках Visual Studio, которые запускаются для Everyone, пользовательские действия запускаются с локальной системной учетной записью (которая требуется для их повышения), поэтому она не будет их искать. Вы спрашиваете, есть ли в системной учетной записи какие-либо сетевые принтеры (а системная учетная запись не имеет доступа к сети). Он обнаруживает, что локальные принтеры имеют жесткую проводку, потому что они доступны для всех пользователей.

В настройках Visual Studio на самом деле нет хорошего объезда. То, что вы делаете, часто достигается наилучшим образом с помощью программы конфигурации, которая запускается при первом запуске приложения. Мне непонятно, почему вы хотите удалить очередь печати во время установки, но если это то, что может потребоваться несколько раз, то пользователь может повторно запустить программу позднее, и, возможно, если принтер такого типа установленный после вашей установки, что-то может потребоваться снова настроить.