Printing from ASP.NET to a network printer

前端 未结 3 1437
醉酒成梦
醉酒成梦 2020-12-01 11:31

I need to send documents to a network printer (\\myserver\\myprinter). I\'m using the System.Printing classes to print, and it works fine when it\'s from a Windows Service,

3条回答
  •  忘掉有多难
    2020-12-01 12:03

    The Network Printing from ASP.Net/C# can be done using:

    If the Network is configured for Domain Users and Printer is added to print server:

    • PrinterName to be defined as = "\\PrintServerIP_OR_Name\\PRINTERNAME" Example: PrinterSettings.PrinterName = "\\15.1.1.1\\prn001"
    • Check the permission set on the Printer Access
    • Which either be Domain Users or Everyone
    • If Domain Users, then the C# code can be enclosed within the impersonation that can be used to call the print code which is as below:
    /// 
        /// 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;
    

    First make an call to impersonate the user and then call the print function that would look like below:

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

提交回复
热议问题