模拟登陆os

 

由于IIS的服务帐户往往没有权限,IO操作比较容易出问题,采用模拟登录

using  System;
using  System.Data;
using  System.Configuration;
using  System.Linq;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  System.Xml.Linq;
using  System.Security.Principal;
using  System.Runtime.InteropServices;


using  System.IO;

public   partial   class  _Default : System.Web.UI.Page 
{
    
public const int LOGON32_LOGON_INTERACTIVE = 2;
    
public const int LOGON32_PROVIDER_DEFAULT = 0;
    WindowsImpersonationContext impersonationContext;
    [DllImport(
"advapi32.dll")]
    
public static extern int LogonUserA(String lpszUserName,
     String lpszDomain,
     String lpszPassword,
     
int dwLogonType,
     
int dwLogonProvider,
     
ref IntPtr phToken);
    [DllImport(
"advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    
public static extern int DuplicateToken(IntPtr hToken,
     
int impersonationLevel,
     
ref IntPtr hNewToken);

    [DllImport(
"advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    
public static extern bool RevertToSelf();
    [DllImport(
"kernel32.dll", CharSet = CharSet.Auto)]
    
public static extern bool CloseHandle(IntPtr handle);


    
protected void Page_Load(object sender, EventArgs e)
    
{
        

    }

    
protected void button1_Click(object sender, EventArgs e)
    
{
        
if (impersonateValidUser("test1""contoso.local""password01!"))
        
{
            
//Insert your code that runs under the security context of a specific user here.
            
//button1.Text = "ok";

            
byte[] att = File.ReadAllBytes(@"/fileserver est1 est.txt");
            
string contentType = "application/octet-stream";
            
string filename = "test.txt";

            Response.AppendHeader(
"Content-Disposition""attachment;FileName=" + filename);
            Response.AppendHeader(
"Content-Length", att.Length.ToString());

            Response.BinaryWrite(att);
            Response.Flush();

            undoImpersonation();
        }

        
else
        
{
            
//Your impersonation failed. Therefore, include a fail-safe mechanism here.
        }

    }



    
private bool impersonateValidUser(String userName, String domain, String password)
    
{
        WindowsIdentity tempWindowsIdentity;
        IntPtr token 
= IntPtr.Zero;
        IntPtr tokenDuplicate 
= IntPtr.Zero;
        
if (RevertToSelf())
        
{
            
if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
             LOGON32_PROVIDER_DEFAULT, 
ref token) != 0)
            
{
                
if (DuplicateToken(token, 2ref tokenDuplicate) != 0)
                
{
                    tempWindowsIdentity 
= new WindowsIdentity(tokenDuplicate);
                    impersonationContext 
= tempWindowsIdentity.Impersonate();
                    
if (impersonationContext != null)
                    
{
                        CloseHandle(token);
                        CloseHandle(tokenDuplicate);
                        
return true;
                    }

                }

            }

        }

        
if (token != IntPtr.Zero)
            CloseHandle(token);
        
if (tokenDuplicate != IntPtr.Zero)
            CloseHandle(tokenDuplicate);
        
return false;
    }

    
private void undoImpersonation()
    
{
        impersonationContext.Undo();
    }


}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值