2010-05-21 237 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。)