在我们的代码中,我们必须为用户提供可供选择的打印机列表。然后,用户选择打印机,并在打印前检查打印机是否有效。在具有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位应用程序。它目前不是此测试的一部分,所以现在它不会导致此错误。
答案 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)
尝试在[控制面板-设备和打印机上设置默认打印机,右键单击一台就绪的打印机并将其设置为默认打印机]