2010-05-21 315 views
1

在我們的代碼中,我們必須爲用戶提供可供選擇的打印機列表。然後用戶選擇一臺打印機並在打印前檢查它是否有效。在帶有IIS 6的Windows 2003服務器上,這可以正常工作。在帶有IIS 7的Windows 2008服務器上,每次impersonate設置爲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設置爲true時,纔會顯示「服務器打印機無效」。如果impersonate設置爲false,則顯示成功消息。

模擬用戶對打印機擁有完全的權利。

有沒有辦法找到打印機無效的實際原因? 我應該檢查一下其他2008年的設置嗎?

更新 當IIS7應用程序池選中「啓用32位應用程序」時,我發現IsValid失敗。這是必須檢查的B/C我們正在使用第三方工具打印,它是一個32位應用程序。它目前不是這個測試的一部分,所以現在它不會導致這個錯誤。

+0

取代 lblMsg.Text =「服務器打印機無效」;我加了 System.Drawing.Printing.InvalidPrinterException jorInvalidEx = new InvalidPrinterException(printerSetting); lblMsg.Text = jorInvalidEx.Message; 這顯示消息「設置訪問打印機<打印機名稱>'無效。」 – Jarrod 2010-05-22 14:58:37

回答

0

IIS 7.0確實被鎖定。這聽起來像服務器沒有正確模擬。打印機配置文件存儲在用戶的HK_CURRENT_USER配置單元中,或者如果它是HK_LOCAL_MACHINE中的本地連接的打印機。

我會使用SYSINTERNALS中的PROCMON來查看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

應用程序池 高級設置 過程模型 更改身份,以用戶管理員

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。)