2010-09-16 18 views
10

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 ricevendo è "Nome della stampante non è valido" Questo è quello che sto usando per ottenere il nome della stampante:Stampa da ASP.NET a una stampante di rete

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

Quali sono le opzioni qui? È un problema con le autorizzazioni?

+2

In quale contesto utente è in esecuzione ASP.NET? Stai usando l'imitazione? Quali sono i permessi sulla stampante? – Heinzi

+0

È in esecuzione in ASP.NET Development Server, quindi presumo sia in esecuzione con il mio account Windows. Sono in grado di stampare direttamente da Blocco note a quella stampante server. – Prabhu

risposta

5

ci sono problemi con le credenziali che si potrebbe risolvere con la rappresentazione o diritti elevatrici degli utenti del web app è in esecuzione.

Tuttavia, l'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 in questo modo (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() 
+0

Quindi posso usare \\ myserver \ myprinter come PrinterName? – Prabhu

+0

abbiamo lasciato \\ myserver \. Un'altra parola che abbiamo chiamato sul server è come l'abbiamo chiamata. Nessun percorso UNC o altro. – klabranche

+0

Oh ok ... quindi intendi che hai installato la stampante di rete come stampante locale? – Prabhu

5

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.

Per servizi di contrasto di Windows di solito eseguite con account di sistema locale (con alti privilegi)

+0

Grazie ... sapresti come posso configurarlo per dargli i privilegi sufficienti? – Prabhu

+0

Ehi, sono un programmatore, non un SysOp. Chiedi [laggiù] (http://serverfault.com/) –

+0

Grazie. Ho verificato che non funzioni anche da un'app Windows Form. – Prabhu

0

La Stampa in rete da ASP.Net/C# può essere fatto utilizzando:

se la rete è configurato per gli utenti e stampante dominio viene aggiunto al server di stampa:

  • printerName per essere definito come = "\\ \\ PrintServerIP_OR_Name nomeStampante" Esempio: PrinterSettings.PrinterName = "\\ 15.1.1.1 \\ prn001"
  • Controllare il set di autorizzazioni sulla stampante ad accesso
  • che o essere Users o Everyone Domain
  • Se gli utenti di dominio, quindi il codice C# possono essere racchiuse all'interno della rappresentazione che può essere utilizzato per chiamare il codice di stampa che è il seguente:
/// <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; 

Prima effettuare una chiamata per rappresentare l'utente e quindi chiamare la funzione di stampa che sarebbe simile di seguito:

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

Problemi correlati