模拟登陆os

来源:互联网 发布:海湾主机编程 编辑:程序博客网 时间:2024/06/01 07:57

 

由于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();
    }


}

 

 

原创粉丝点击