2010-09-16 16 views
10

Belgeleri bir ağ yazıcısına (\ myserver \ myprinter) göndermem gerekiyor. Yazdırmak için System.Printing sınıflarını kullanıyorum ve bir Windows Hizmetinden geldiğinde iyi çalışıyor, ancak bir ASP.NET uygulamasından, ağ yazıcıları değil, yalnızca yerel yazıcılara yazdırabiliyor. Ben alıyorum hata Bu benim yazıcı adını almak için kullanıyorum budur "Yazıcı Adı geçerli değil" dir:ASP.NET'ten ağ yazıcısına yazdırma

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

seçeneklerim burada nelerdir? Bu bir izin sorunu mu?

+2

hangi kullanıcı bağlamı altında ASP.NET çalışıyor? Kimliğe bürünme kullanıyor musunuz? Yazıcının izinleri nelerdir? – Heinzi

+0

ASP.NET Geliştirme Sunucusunda çalışıyor, bu yüzden Windows hesabım altında çalıştığı varsayılıyor. Not Defteri'nden doğrudan bu sunucu yazıcısına yazdıramıyorum. – Prabhu

cevap

5

Kimliğe bürünme veya web uygulaması altında çalışan kullanıcının yükseltilmesi hakları ile çözebilir kimlik bilgileriyle sorunları vardır By

. Bununla birlikte, ağ yazıcısını sunucuda bir yazıcı olarak ekleyerek (sunucuda yazıcı diyaloğu ekleyerek) ve işin bu yazıcıya gönderilmesini sağlayarak gerçekleştirdik.

Biz Printing.PrintDocument gibi pek (VB Kod) .... kullanılan

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

Yani \\ myserver \ myprinter'ı PrinterName olarak kullanabilir miyim? – Prabhu

+0

biz dışarı çıktık \\ myserver \. Sunucuda isimlendirdiğimiz bir başka kelime, onu nasıl adlandırdığımız. UNC yolu yok ya da başka bir şey yok. – klabranche

+0

Tamam, yani ağ yazıcısını yerel bir yazıcı olarak mı yüklediniz? – Prabhu

5

Varsayılan olarak, bir ASP.NET uygulaması sınırlı haklara sahip özel bir hesapta çalışır. Sadece web sayfalarını sunmak için yeterli, başka bir şey değil. Bu yüzden ASPNET kullanıcısını yapılandırmanız gerekecek. (Yüksek ayrıcalıklarla), genellikle lokal sistem hesabı altında çalışacak kontrast Windows hizmetleri

+0

Teşekkürler ... ona yeterli ayrıcalıkları vermek için nasıl yapılandırabilirim biliyor musunuz? – Prabhu

+0

Hey, ben bir programcıyım, SysOp değil. [Oraya] sorun (http://serverfault.com/) –

+0

Teşekkürler. Ayrıca bir Windows Forms App'den çalışmadığını kontrol ettim. – Prabhu

0
ASP.Net/C# Ağ Baskı kullanılarak yapılabilir

:

Ağ ise

  • YazıcıAdı "\\ PrintServerIP_OR_Name \\ yazıcıadı" Örnek = olarak tanımlanabilir için: Alan Kullanıcılar ve yazıcı için yapılandırılmış sunucu baskı eklenir 15.1.1.1 PrinterSettings.PrinterName = "\\ \\ prn001"
  • Kontrol Alan Kullanıcılar veya Herkes olabilir ya Yazıcı Erişim
  • ayarlanmış izin
  • Alan Kullanıcılar, sonra C# kodu baskı kodu aramak için kullanılabilecek bürünme içinde verilebilir Eğer hangi aşağıdaki gibidir:

    :
/// <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; 

İlk kullanıcıyı taklit ve ardından aşağıdaki gibi görünecektir baskı işlevi çağırmak için bir çağrı yapmak

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