2010-05-21 7 views
1

В нашем коде мы должны предоставить пользователям список принтеров на выбор. Затем пользователь выбирает принтер, и он проверяется, чтобы убедиться, что он действителен перед печатью. На сервере Windows 2003 с IIS 6 это работает отлично. На сервере Windows 2008 с IIS 7 он терпит неудачу при каждом выдаче заимствования, установленном в значение true.PrinterSettings.IsValid всегда возвращает false

PrinterSettings printerSetting = new PrinterSettings(); 
printerSetting.PrinterName = ddlPrinterName.SelectedItem.Text; 
if (!printerSetting.IsValid) 
{ 
    lblMsg.Text = "Server Printer is not valid."; 
} 
else 
{ 
    lblMsg.Text = "Success"; 
} 

Каждый раз, когда этот код запускается, «Сервер печати не действителен» отображается, только если Impersonate устанавливается истина. Если для олицетворения установлено значение false, отображается сообщение об успешном завершении.

Пользователь олицетворяет полное право на принтер.

Есть ли способ поймать фактическую причину, по которой принтер недействителен? Есть ли еще одна настройка 2008 года, которую я должен проверить?

update Я обнаружил, что IsValid терпит неудачу, когда пулы приложений IIS7 имеют «Включить 32-разрядные приложения». Это нужно проверить b/c, мы используем сторонний инструмент для печати, и это 32-битное приложение. В настоящее время он не является частью этого теста, поэтому прямо сейчас он не вызывает эту ошибку.

+0

вместо lblMsg.Text = "Серверный принтер недействителен"; Я добавил System.Drawing.Printing.InvalidPrinterException jorInvalidEx = новое InvalidPrinterException (printerSetting); lblMsg.Text = jorInvalidEx.Message; На дисплее отобразилось сообщение «Настройки для доступа к принтеру» <имя принтера> 'недействительны. " – Jarrod

ответ

0

IIS 7.0 действительно заблокирован. Похоже, сервер не олицетворяет себя должным образом. Профили принтера хранятся в улей HK_CURRENT_USER пользователя или если это локально подключенный принтер в HK_LOCAL_MACHINE.

Я бы использовал PROCMON из SYSINTERNALS, чтобы увидеть вызовы, которые выполняет процесс IIS.

0

Вы можете попробовать, обратившись к Системе с помощью WMI. Способ для того чтобы достигнуть этого может быть следующим:

using System.Management; 

    private List<string> GetPrinters() 
    {  
    List<string> printerNames = new List<string>(); 

    System.Management.ObjectQuery oquery = 
     new System.Management.ObjectQuery("SELECT * FROM Win32_Printer"); 

    System.Management.ManagementObjectSearcher mosearcher = 
     new System.Management.ManagementObjectSearcher(oquery); 

    System.Management.ManagementObjectCollection moc = mosearcher.Get(); 

    foreach (ManagementObject mo in moc) 
    { 
     System.Management.PropertyDataCollection pdc = mo.Properties; 
     foreach (System.Management.PropertyData pd in pdc) 
     { 
      if ((bool)mo["Network"]) 
      { 
       printerNames.Add(mo[pd.Name]); 
      } 
     } 
    } 

    return printerNames; 
} 

После того, подобным образом, вы можете найти другую информацию принтера, как если принтер готов к работе. Найти больше здесь: https://stackoverflow.com/a/1622931/2791580

С уважением

0

Приложения Бассейн Advanced Настройка Process Model Изменить Идентичность для администраторов пользователей

oPD.PrinterSettings.PrinterName = \\10.10.1.1\myprintertnetwork; 
0

Я имел точно такая же проблема, и я был в состоянии чтобы решить проблему, временно покинув контекст олицетворения. Адаптируйте ваш пример, следующий код:

PrinterSettings printerSetting = new PrinterSettings(); 
printerSetting.PrinterName = ddlPrinterName.SelectedItem.Text; 

using (var wic = WindowsIdentity.Impersonate(IntPtr.Zero)) 
{ 
    if (!printerSetting.IsValid) 
    { 
     lblMsg.Text = "Server Printer is not valid."; 
    } 
    else 
    { 
     lblMsg.Text = "Success"; 
    } 

    // Do the remainder of your printing stuff here, but beware that 
    // your user context is different. 
} 

должно дать сообщение об успешном завершении. (Кредит для этого решения относится к Jon Saffron.)

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