Печать из ASP.NET на сетевой принтер - PullRequest
10 голосов
/ 16 сентября 2010

Мне нужно отправить документы на сетевой принтер (\ myserver \ myprinter).Я использую классы System.Printing для печати, и она отлично работает, когда она из службы Windows, но из приложения ASP.NET она может печатать только на локальных принтерах, а не на сетевых принтерах.Я получаю сообщение об ошибке «Имя принтера неверно». Это то, что я использую, чтобы получить имя принтера:

public string PrinterName
{
   using (LocalPrintServer server = new LocalPrintServer())
   return server.GetPrintQueue(@"\\myserver\myprinter");
}

Какие у меня есть варианты?Это проблема с разрешениями?

Ответы [ 3 ]

5 голосов
/ 16 сентября 2010

Существуют проблемы с учетными данными, которые можно решить с помощью олицетворения или повышения прав пользователя, под которым выполняется веб-приложение.

Однако мы сделали это, добавив сетевой принтер в качестве принтера на сервере (добавьте диалоговое окно принтера) и отправьте задание на этот принтер.

Мы использовали такой же тип Printing.PrintDocument (код в VB) ....

Public Class SpecialReportPrintJob
  Inherits Printing.PrintDocument

Protected Overrides Sub OnBeginPrint(ByVal ev as Printing.PrintEventArgs)
  MyBase.OnBeginPrint(ev)

  Me.PrinterSettings.PrinterName = "PrinterNameUsedOnServer"

  'setup rest of stuff....
End Sub  
End Class
'And we then call it like so
Dim printSpecialReport as new SpecialReportPrintJob()
printSpecialReport.Print()
5 голосов
/ 16 сентября 2010

По умолчанию приложение ASP.NET запускается под специальной учетной записью с ограниченными правами.Просто достаточно, чтобы обслуживать веб-страницы, не более того.Поэтому вам придется настроить пользователя ASPNET.

В отличие от этого службы Windows обычно работают под локальной системной учетной записью (с высокими привилегиями)

0 голосов
/ 14 мая 2016

Печать по сети из ASP.Net/C# может быть выполнена с помощью:

Если сеть настроена для пользователей домена и принтер добавлен на сервер печати:

  • Имя_принтера определяется как = "\\ PrintServerIP_OR_Name \\ PRINTERNAME" Пример: PrinterSettings.PrinterName = "\\ 15.1.1.1 \\ prn001"
  • Проверьте права доступа, установленные для доступа к принтеру
  • Которые либо пользователи домена, либо все
  • Если пользователи домена, то код C # может быть заключен в олицетворение, которое можно использовать для вызова кода печати, как показано ниже:
/// <summary>
    /// Does the actual impersonation.
    /// </summary>
    /// <param name="userName">The name of the user to act as.</param>
    /// <param name="domainName">The domain name of the user to act as.</param>
    /// <param name="password">The password of the user to act as.</param>
    private void ImpersonateValidUser(
        string userName, 
        string domain, 
        string password )
    {
        WindowsIdentity tempWindowsIdentity = null;
        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;

        try
        {
            if ( RevertToSelf() )
            {
                if ( LogonUser(
                    userName, 
                    domain, 
                    password, 
                    LOGON32_LOGON_INTERACTIVE,
                    LOGON32_PROVIDER_DEFAULT, 
                    ref token ) != 0 )
                {
                    if ( DuplicateToken( token, 2, ref tokenDuplicate ) != 0 )
                    {
                        tempWindowsIdentity = new WindowsIdentity( tokenDuplicate );
                        impersonationContext = tempWindowsIdentity.Impersonate();
                    }
                    else
                    {
                        throw new Win32Exception( Marshal.GetLastWin32Error() );
                    }
                }
                else
                {
                    throw new Win32Exception( Marshal.GetLastWin32Error() );
                }
            }
            else
            {
                throw new Win32Exception( Marshal.GetLastWin32Error() );
            }
        }
        finally
        {
            if ( token!= IntPtr.Zero )
            {
                CloseHandle( token );
            }
            if ( tokenDuplicate!=IntPtr.Zero )
            {
                CloseHandle( tokenDuplicate );
            }
        }
    }

    /// <summary>
    /// Reverts the impersonation.
    /// </summary>
    private void UndoImpersonation()
    {
        if ( impersonationContext!=null )
        {
            impersonationContext.Undo();
        }   
    }

    private WindowsImpersonationContext impersonationContext = null;

Сначала сделайте вызов, чтобы выдать себя за пользователя, а затем вызовите функцию печати, которая будет выглядеть следующим образом:

if(ImpersonateValidUser("username", "domain", "password"))
{
  PrintDetails();
  UndoImpersonation();
}
...