using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using fdfacx_clr;
using iTextSharp.text.pdf;
namespace Sogo.Invest.Web.Account
{
public partial class HistoricalStament : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnHisStatement_Click(object sender, EventArgs e)
{
string filePath = System.Configuration.ConfigurationManager.AppSettings["HisStaPath"]
+ @"\" + drDnYear.SelectedValue + @"\" + drDnMonth.SelectedValue;
string searchPatten = UserSession.User.ClearingAccountId + @"*.pdf";
string[] dirs = HisStaImpersonator.GetInstance().GetFiles(filePath, searchPatten);
if (dirs.Count() > 1)
{
var ipageList=new List<string>();
foreach (string dir in dirs)
{
int iStart = dir.LastIndexOf('\\')+1;
ipageList.Add(dir.Substring(iStart, dir.Length - iStart - 4));
}
hisStaGridView.DataSource = ipageList;
hisStaGridView.DataBind();
ModalPopupExtender1.Show();
}
else if (dirs.Count() ==1)
{
RenderStatementITextPdf(dirs[0]);
}
else
{
//message box
}
}
protected void RenderStatementITextPdf(string filePath)
{
//string location = System.Configuration.ConfigurationManager.AppSettings["Location_NewAccountApplicationForm_NRA_JNT_cash"];
if (string.IsNullOrEmpty(filePath))
{
return;
}
int iStart = filePath.LastIndexOf('\\') + 1;
if(iStart<2) return;
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", " attachment; filename = " + filePath.Substring(iStart, filePath.Length - iStart - 4));
var reader = new PdfReader(filePath);
var stamper = new PdfStamper(reader, Response.OutputStream);
stamper.Writer.CloseStream = false;
stamper.Close();
reader.Close();
Response.Flush();
}
protected string FormatStaName(object item)
{
return item as string;
}
}
}
HisStaImpersonator.cs
using System;
using System.Configuration;
using System.Drawing;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Security.Principal;
using System.IO;
using Laser.Common;
namespace Sogo.Invest.Web.Account
{
public class HisStaImpersonator
{
private static HisStaImpersonator instance;
private static readonly object _lock = new object();
private WindowsImpersonationContext _impersonationContext;
private readonly string _user;
private readonly string _pass;
private IntPtr _userHandle = IntPtr.Zero;
private IntPtr _tokenDuplicate = IntPtr.Zero;
public static HisStaImpersonator GetInstance()
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{
instance = new HisStaImpersonator(System.Configuration.ConfigurationManager.AppSettings["HisStaDominName"], System.Configuration.ConfigurationManager.AppSettings["HisStaPW"]);
//instance.Login();
}
}
}
return instance;
}
private HisStaImpersonator(string user, string pass)
{
_user = user;
_pass = pass;
}
~HisStaImpersonator()
{
Undo();
}
private bool Impersonate()
{
// Call LogonUser to get a token for the user
string[] domainUser = _user.Split('\\');
if (domainUser.Length < 2)
throw new ConfigurationErrorsException("DomainUserName must be of the form 'domain\\username'");
int loggedOn = LogonUser(
domainUser[1],
domainUser[0],
_pass,
(int) LogonType.LOGON32_LOGON_NEW_CREDENTIALS,
(int) LogonProvider.LOGON32_PROVIDER_DEFAULT,
ref _userHandle);
if (_userHandle == IntPtr.Zero)
{
CloseHandle(_userHandle);
return false;
}
if (loggedOn != 0 && DuplicateToken(_userHandle, 2, ref _tokenDuplicate) != 0)
{
var tempWindowsIdentity = new WindowsIdentity(_tokenDuplicate);
_impersonationContext = tempWindowsIdentity.Impersonate();
}
if (_impersonationContext == null)
{
if (_userHandle != IntPtr.Zero) CloseHandle(_userHandle);
if (_tokenDuplicate != IntPtr.Zero) CloseHandle(_tokenDuplicate);
return false;
}
return true;
}
private void Undo()
{
if (_userHandle != IntPtr.Zero) CloseHandle(_userHandle);
if (_tokenDuplicate != IntPtr.Zero) CloseHandle(_tokenDuplicate);
if (_impersonationContext != null) _impersonationContext.Undo();
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool CloseHandle(IntPtr hHandle);
[DllImport("advapi32.dll", SetLastError = true)]
private static extern int LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken
);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool RevertToSelf();
private enum LogonType : int
{
/// <summary>
/// This logon type is intended for users who will be interactively using the computer, such as a user being logged on
/// by a terminal server, remote shell, or similar process.
/// This logon type has the additional expense of caching logon information for disconnected operations;
/// therefore, it is inappropriate for some client/server applications,
/// such as a mail server.
/// </summary>
LOGON32_LOGON_INTERACTIVE = 2,
/// <summary>
/// This logon type is intended for high performance servers to authenticate plaintext passwords.
/// The LogonUser function does not cache credentials for this logon type.
/// </summary>
LOGON32_LOGON_NETWORK = 3,
/// <summary>
/// This logon type is intended for batch servers, where processes may be executing on behalf of a user without
/// their direct intervention. This type is also for higher performance servers that process many plaintext
/// authentication attempts at a time, such as mail or Web servers.
/// The LogonUser function does not cache credentials for this logon type.
/// </summary>
LOGON32_LOGON_BATCH = 4,
/// <summary>
/// Indicates a service-type logon. The account provided must have the service privilege enabled.
/// </summary>
LOGON32_LOGON_SERVICE = 5,
/// <summary>
/// This logon type is for GINA DLLs that log on users who will be interactively using the computer.
/// This logon type can generate a unique audit record that shows when the workstation was unlocked.
/// </summary>
LOGON32_LOGON_UNLOCK = 7,
/// <summary>
/// This logon type preserves the name and password in the authentication package, which allows the server to make
/// connections to other network servers while impersonating the client. A server can accept plaintext credentials
/// from a client, call LogonUser, verify that the user can access the system across the network, and still
/// communicate with other servers.
/// NOTE: Windows NT: This value is not supported.
/// </summary>
LOGON32_LOGON_NETWORK_CLEARTEXT = 8,
/// <summary>
/// This logon type allows the caller to clone its current token and specify new credentials for outbound connections.
/// The new logon session has the same local identifier but uses different credentials for other network connections.
/// NOTE: This logon type is supported only by the LOGON32_PROVIDER_WINNT50 logon provider.
/// NOTE: Windows NT: This value is not supported.
/// </summary>
LOGON32_LOGON_NEW_CREDENTIALS = 9,
}
private enum LogonProvider : int
{
/// <summary>
/// Use the standard logon provider for the system.
/// The default security provider is negotiate, unless you pass NULL for the domain name and the user name
/// is not in UPN format. In this case, the default provider is NTLM.
/// NOTE: Windows 2000/NT: The default security provider is NTLM.
/// </summary>
LOGON32_PROVIDER_DEFAULT = 0,
}
#region HisStaImpersonator Members
public void Login()
{
Impersonate();
}
public void Logout()
{
Undo();
}
public string[] GetFiles(string root, string pattern)
{
Impersonate();
try
{
return Directory.GetFiles(root, pattern);
}
finally
{
Undo();
}
}
#endregion
}
}