2013-04-03 3 views
0

Я хочу, чтобы все имя принтера было установлено на компьютере и в сети. Я использовал эти функции ниже, чтобы получить список всех принтеров. Все эти функции. работает правильно в приложении консоли и формы, и я могу получить список всех принтеров, но когда я пытаюсь использовать эти функции. в службе windows я могу установить только на компьютер без сети. А также мой сервис работает под учетной записью LocalSystem.Как получить все имя принтера в службе Windows?

Func 1:

 WinsPool.PrinterEnumFlags Flags = WinsPool.PrinterEnumFlags.PRINTER_ENUM_CONNECTIONS | WinsPool.PrinterEnumFlags.PRINTER_ENUM_LOCAL; 
     const int ERROR_INSUFFICIENT_BUFFER = 122; 
     uint cbNeeded = 0; 
     uint cReturned = 0; 
     if (WinsPool.EnumPrinters(Flags, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned)) 
     { 
      return null; 
     } 
     int lastWin32Error = Marshal.GetLastWin32Error(); 
     if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER) 
     { 
      IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded); 
      if (WinsPool.EnumPrinters(Flags, null, 2, pAddr, cbNeeded, ref cbNeeded, ref cReturned)) 
      { 
       WinsPool.PRINTER_INFO_2[] printerInfo2 = new WinsPool.PRINTER_INFO_2[cReturned]; 
       int offset = pAddr.ToInt32(); 
       Type type = typeof(WinsPool.PRINTER_INFO_2); 
       int increment = Marshal.SizeOf(type); 
       for (int i = 0; i < cReturned; i++) 
       { 
        printerInfo2[i] = (WinsPool.PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), type); 
        string printerName = printerInfo2[i].pPrinterName; 
        offset += increment; 
       } 
       Marshal.FreeHGlobal(pAddr); 
      } 
      lastWin32Error = Marshal.GetLastWin32Error(); 
     } 

Func 2:

 foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters) 
     { 
      string printerName = printer; 
     } 

Func 3:

  ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher("root\\CIMV2", 
       "SELECT * FROM Win32_Printer"); 

      foreach (ManagementObject queryObj in searcher.Get()) 
      { 
       string printerName = queryObj["Name"].ToString(); 
      } 
+0

«моя служба работает под LocalSystem счетов» - тогда он появится в любых сетевых принтеры, как ваш счет машины - это ваша учетная запись компьютера имеет разрешение на доступ к любому из этих принтеров ? –

+0

yes У меня есть разрешения на доступ ко всем. – mburakerbay

+0

** Вы ** есть, но ваш ** машина **? –

ответ

1

принтеры часто устанавливаются для конкретного Windows, поэтому они будут видны только в том случае, если вы войдете в систему как эта учетная запись. Для службы Windows, которая нуждается в доступе к принтерам, нормально запускать ее как именованную учетную запись, для которой видны необходимые принтеры, т. Е. Не запускать ее как LocalSystem.

1

Вот как начать:

public partial class Service : ServiceBase 
{ 
    List<string> printers = new List<string>(); 
    public Service() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     getPrinters(); 
    } 

    private void getPrinters() 
    { 
     foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters) 
     { 
      printers.Add(printer); 
     } 

    } 

    static void Main() 
    { 
     (new Service()).OnStart(null); // allows easy debugging of OnStart() 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^