Stampa da ASP.NET a una stampante di rete

Devo inviare documenti a una stampante di rete (\ myserver \ myprinter). Sto usando le classi System.Printing per stampare e funziona bene quando proviene da un servizio Windows, ma da un’app ASP.NET, è in grado di stampare solo su stampanti locali, non su stampanti di rete. L’errore che sto ottenendo è “Il nome della stampante non è valido” Questo è quello che sto usando per ottenere il nome della stampante:

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

quali sono le mie opzioni? È un problema con le autorizzazioni?

Esistono problemi con le credenziali che è ansible risolvere mediante la rappresentazione o l’aumento dei diritti dell’utente in cui è in esecuzione l’app web.

Tuttavia, lo abbiamo fatto aggiungendo la stampante di rete come stampante sul server (aggiungi la finestra di dialogo della stampante sul server) e inviando il lavoro a quella stampante.

Abbiamo usato il Printing.PrintDocument come tale (Codice in 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() 

Per impostazione predefinita, un’applicazione ASP.NET viene eseguita su un account speciale con diritti limitati. Quanto basta per servire le pagine web, niente di più. Quindi dovrai configurare l’utente ASPNET.

Al contrario, i servizi Windows di solito funzionano con l’account di sistema locale (con privilegi elevati)

La stampa in rete da ASP.Net/C# può essere eseguita utilizzando:

Se la rete è configurata per gli utenti del dominio e la stampante viene aggiunta al server di stampa:

  • PrinterName da definire come = “\\ PrintServerIP_OR_Name \\ PRINTERNAME” Esempio: PrinterSettings.PrinterName = “\\ 15.1.1.1 \\ prn001”
  • Controllare il permesso impostato sull’accesso alla stampante
  • Quali possono essere Domain Users o Everyone
  • Se Domain Users, il codice C # può essere racchiuso all’interno della rappresentazione che può essere utilizzata per chiamare il codice di stampa che è il seguente:
 ///  /// Does the actual impersonation. ///  /// The name of the user to act as. /// The domain name of the user to act as. /// The password of the user to act as. 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 ); } } } ///  /// Reverts the impersonation. ///  private void UndoImpersonation() { if ( impersonationContext!=null ) { impersonationContext.Undo(); } } private WindowsImpersonationContext impersonationContext = null; 

Per prima cosa effettua una chiamata per impersonare l’utente e quindi chiama la funzione di stampa che dovrebbe apparire come di seguito:

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