首页 > 代码库 > 通过身份模拟实现远程资源访问
通过身份模拟实现远程资源访问
以下内容来源:http://www.cnblogs.com/h2appy/articles/1204277.html
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Runtime.InteropServices; 6 7 namespace WebApplication1 8 { 9 public class WNetHelper10 {11 12 #region 通过身份模拟实现远程资源访问13 14 // logon types15 const int LOGON32_LOGON_INTERACTIVE = 2;16 const int LOGON32_LOGON_NETWORK = 3;17 const int LOGON32_LOGON_NEW_CREDENTIALS = 9;18 // logon providers19 const int LOGON32_PROVIDER_DEFAULT = 0;20 const int LOGON32_PROVIDER_WINNT50 = 3;21 const int LOGON32_PROVIDER_WINNT40 = 2;22 const int LOGON32_PROVIDER_WINNT35 = 1;23 24 [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]25 public static extern int LogonUser(String lpszUserName,26 String lpszDomain,27 String lpszPassword,28 int dwLogonType,29 int dwLogonProvider,30 ref IntPtr phToken);31 32 [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]33 public static extern int DuplicateToken(IntPtr hToken,34 int impersonationLevel,35 ref IntPtr hNewToken);36 37 [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]38 public static extern bool RevertToSelf();39 40 [DllImport("kernel32.dll", CharSet = CharSet.Auto)]41 public static extern bool CloseHandle(IntPtr handle);42 43 private static System.Security.Principal.WindowsImpersonationContext impersonationContext;44 /// <summary>45 /// 连接网络资源46 /// </summary>47 /// <param name="domain">IP/计算机名</param>48 /// <param name="userName">用户名</param>49 /// <param name="password">密码</param>50 /// <returns></returns>51 public static bool impersonateValidUser(String domain, String userName, String password)52 {53 System.Security.Principal.WindowsIdentity tempWindowsIdentity;54 IntPtr token = IntPtr.Zero;55 IntPtr tokenDuplicate = IntPtr.Zero;56 57 if (RevertToSelf())58 {59 // 这里使用LOGON32_LOGON_NEW_CREDENTIALS来访问远程资源。60 // 如果要(通过模拟用户获得权限)实现服务器程序,访问本地授权数据库可61 // 以用LOGON32_LOGON_INTERACTIVE62 if (LogonUser(userName, domain, password, LOGON32_LOGON_NEW_CREDENTIALS,63 LOGON32_PROVIDER_DEFAULT, ref token) != 0)64 {65 if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)66 {67 tempWindowsIdentity = new System.Security.Principal.WindowsIdentity(tokenDuplicate);68 impersonationContext = tempWindowsIdentity.Impersonate();69 if (impersonationContext != null)70 {71 System.AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal);72 System.Security.Principal.IPrincipal pr = System.Threading.Thread.CurrentPrincipal;73 System.Security.Principal.IIdentity id = pr.Identity;74 CloseHandle(token);75 CloseHandle(tokenDuplicate);76 return true;77 }78 }79 }80 }81 if (token != IntPtr.Zero)82 CloseHandle(token);83 if (tokenDuplicate != IntPtr.Zero)84 CloseHandle(tokenDuplicate);85 return false;86 }87 88 public static void undoImpersonation()89 {90 impersonationContext.Undo();91 }92 93 #endregion94 }95 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 using System.IO; 8 9 namespace WebApplication110 {11 public partial class WebForm1 : System.Web.UI.Page12 {13 protected void Page_Load(object sender, EventArgs e)14 {15 TestFunc();16 17 }18 19 public void TestFunc()20 {21 bool isImpersonated = false;22 try23 {24 if (WNetHelper.impersonateValidUser("Netnetnet-pc", "admin2", "123"))25 {26 isImpersonated = true;27 System.IO.File.Copy(@"\\Netnetnet-pc\站点发布\a.txt", "d:\\a1.txt", true);28 }29 }30 finally31 {32 if (isImpersonated)33 WNetHelper.undoImpersonation();34 }35 }36 }37 }
通过身份模拟实现远程资源访问
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。