PrinterSettings.IsValid始终返回false

时间:2010-05-21 17:29:27

标签: c# asp.net printing

在我们的代码中,我们必须为用户提供可供选择的打印机列表。然后,用户选择打印机,并在打印前检查打印机是否有效。在具有IIS 6的Windows 2003服务器上,这很好用。在带有IIS 7的Windows 2008服务器上,每次将impersonate设置为true时它都会失败。

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位应用程序。它目前不是此测试的一部分,所以现在它不会导致此错误。

5 个答案:

答案 0 :(得分:0)

IIS 7.0确实被锁定了。听起来服务器没有正确冒充。打印机配置文件存储在用户的HK_CURRENT_USER配置单元中,或者如果它是HK_LOCAL_MACHINE中的本地连接的打印机。

我会使用SYSINTERNALS的PROCMON来查看IIS进程正在进行的调用。

答案 1 :(得分: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

此致

答案 2 :(得分:0)

应用程序池    高级设置    过程模型       将身份更改为用户管理员

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

答案 3 :(得分: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.
}

应该产生成功消息。 (此解决方案的信用额度为status.streamStatus。)

答案 4 :(得分:0)

尝试在[控制面板-设备和打印机上设置默认打印机,右键单击一台就绪的打印机并将其设置为默认打印机]