PrinterSettings.IsValid всегда возвращает false - PullRequest
1 голос
/ 21 мая 2010

В нашем коде мы должны предоставить пользователям список принтеров на выбор. Затем пользователь выбирает принтер и проверяется, чтобы убедиться, что он действителен перед печатью. На сервере Windows 2003 с IIS 6 это работает нормально. На сервере Windows 2008 с IIS 7 происходит сбой каждый раз, когда для олицетворения устанавливается значение 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 года, которые я должен проверить?

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

Ответы [ 4 ]

0 голосов
/ 19 ноября 2015

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

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.
}

должен выдать сообщение об успехе.(Кредит для этого решения идет в Джон Саффрон .)

0 голосов
/ 07 апреля 2015

Вы можете попробовать, запросив Систему с помощью 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 голосов
/ 15 мая 2015

Пул приложений Расширенные настройки Модель процесса Изменить личность для администраторов пользователей

oPD.PrinterSettings.PrinterName = \\10.10.1.1\myprintertnetwork;
0 голосов
/ 21 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...