- 本站大部分内容从网上收集,收集目的仅供研究、学习。涉及版权或不希望收录您的文章请您及时与我联系。
- 本站IM群,请自行选择。请各位朋友按照自己喜好加入。加入群后请及时发言,防止被清理。谢谢您的合作!!!
- QQ群:Y①WEB开发(ASP.NET)号码:7351660 QQ群:Y②WEB开发(ASP+.NET)号码:11864905
- QQ群:Y③WEB开发(DIV+CSS)号码:16610506 QQ群:Y④WEB开发(JS+AJAX)号码:16143998
- QQ群:Y⑤WEB开发(新手)号码:12777715 MSN群:yaosansi[at]126.com
原文:http://blog.joycode.com/kaneboy/articles/3801.aspx
1
/// 用户模拟角色类。实现在程序段内进行用户角色模拟。
2
/// <example><![CDATA[使用的时候在你要执行特殊操作的代码段前面这样写:
3
/// IdentityImpersonation identityImpersonation = new IdentityImpersonation("administrator", "yourpassword","yourhostname");
4
/// identityImpersonation.BeginImpersonate();//开始管理员扮演
5
/// //你的特殊操作
6
///
..
7
///
.
8
/// identityImpersonation.StopImpersonate(); //结束扮演]]>
9
/// </example>
10
///
11
public class IdentityImpersonation
12
{
13
14
[DllImport("advapi32.dll", SetLastError = true)]
15
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
16
17
18
19
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
20
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
21
22
23
24
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
25
public extern static bool CloseHandle(IntPtr handle);
26
27
28
29
// 要模拟的用户的用户名、密码、域(机器名)
30
private String _sImperUsername;
31
32
private String _sImperPassword;
33
34
private String _sImperDomain;
35
36
// 记录模拟上下文
37
private WindowsImpersonationContext _imperContext;
38
39
private IntPtr _adminToken;
40
41
private IntPtr _dupeToken;
42
43
// 是否已停止模拟
44
private Boolean _bClosed;
45
46
47
48
49
/// <summary>
50
/// 构造函数
51
/// </summary>
52
/// <param name="impersonationUsername">所要模拟的用户的用户名</param>
53
/// <param name="impersonationPassword">所要模拟的用户的密码</param>
54
/// <param name="impersonationDomain">所要模拟的用户所在的域</param>
55
public IdentityImpersonation(String impersonationUsername, String impersonationPassword, String impersonationDomain)
56
{
57
58
_sImperUsername = impersonationUsername;
59
_sImperPassword = impersonationPassword;
60
_sImperDomain = impersonationDomain;
61
62
_adminToken = IntPtr.Zero;
63
_dupeToken = IntPtr.Zero;
64
_bClosed = true;
65
66
}
67
68
69
70
/// <summary>
71
/// 析构函数
72
/// </summary>
73
~IdentityImpersonation()
74
{
75
if (!_bClosed)
76
{
77
StopImpersonate();
78
}
79
}
80
81
82
83
/// <summary>
84
/// 开始身份角色模拟。
85
/// </summary>
86
/// <returns></returns>
87
88
89
public Boolean BeginImpersonate()
90
{
91
Boolean bLogined = LogonUser(_sImperUsername, _sImperDomain, _sImperPassword, 2, 0, ref _adminToken);
92
if (!bLogined)
93
{
94
return false;
95
}
96
Boolean bDuped = DuplicateToken(_adminToken, 2, ref _dupeToken);
97
if (!bDuped)
98
{
99
return false;
100
}
101
102
WindowsIdentity fakeId = new WindowsIdentity(_dupeToken);
103
_imperContext = fakeId.Impersonate();
104
_bClosed = false;
105
return true;
106
107
}
108
109
110
/// <summary>
111
/// 停止身分角色模拟。
112
/// </summary>
113
public void StopImpersonate()
114
{
115
_imperContext.Undo();
116
CloseHandle(_dupeToken);
117
CloseHandle(_adminToken);
118
_bClosed = true;
119
120
}
121
122
}
/// 用户模拟角色类。实现在程序段内进行用户角色模拟。 2
/// <example><![CDATA[使用的时候在你要执行特殊操作的代码段前面这样写: 3
/// IdentityImpersonation identityImpersonation = new IdentityImpersonation("administrator", "yourpassword","yourhostname"); 4
/// identityImpersonation.BeginImpersonate();//开始管理员扮演 5
/// //你的特殊操作 6
///
.. 7
///
. 8
/// identityImpersonation.StopImpersonate(); //结束扮演]]>9
/// </example>10
/// 11
public class IdentityImpersonation12
{13

14
[DllImport("advapi32.dll", SetLastError = true)]15
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);16

17

18

19
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]20
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);21

22

23

24
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]25
public extern static bool CloseHandle(IntPtr handle);26

27

28

29
// 要模拟的用户的用户名、密码、域(机器名) 30
private String _sImperUsername;31

32
private String _sImperPassword;33

34
private String _sImperDomain;35

36
// 记录模拟上下文 37
private WindowsImpersonationContext _imperContext;38

39
private IntPtr _adminToken;40

41
private IntPtr _dupeToken;42

43
// 是否已停止模拟 44
private Boolean _bClosed;45

46

47

48

49
/// <summary>50
/// 构造函数51
/// </summary>52
/// <param name="impersonationUsername">所要模拟的用户的用户名</param>53
/// <param name="impersonationPassword">所要模拟的用户的密码</param>54
/// <param name="impersonationDomain">所要模拟的用户所在的域</param>55
public IdentityImpersonation(String impersonationUsername, String impersonationPassword, String impersonationDomain)56
{57

58
_sImperUsername = impersonationUsername;59
_sImperPassword = impersonationPassword;60
_sImperDomain = impersonationDomain;61

62
_adminToken = IntPtr.Zero;63
_dupeToken = IntPtr.Zero;64
_bClosed = true;65

66
}67

68

69

70
/// <summary>71
/// 析构函数72
/// </summary>73
~IdentityImpersonation()74
{75
if (!_bClosed)76
{77
StopImpersonate();78
}79
}80

81

82

83
/// <summary>84
/// 开始身份角色模拟。 85
/// </summary>86
/// <returns></returns>87

88

89
public Boolean BeginImpersonate()90
{91
Boolean bLogined = LogonUser(_sImperUsername, _sImperDomain, _sImperPassword, 2, 0, ref _adminToken);92
if (!bLogined)93
{94
return false;95
}96
Boolean bDuped = DuplicateToken(_adminToken, 2, ref _dupeToken);97
if (!bDuped)98
{99
return false;100
}101

102
WindowsIdentity fakeId = new WindowsIdentity(_dupeToken);103
_imperContext = fakeId.Impersonate();104
_bClosed = false;105
return true;106

107
}108

109

110
/// <summary>111
/// 停止身分角色模拟。 112
/// </summary>113
public void StopImpersonate()114
{115
_imperContext.Undo();116
CloseHandle(_dupeToken);117
CloseHandle(_adminToken);118
_bClosed = true;119

120
}121

122
}
1
/// <summary>
2
/// 比如,从机器A操作实现把机器B的文件拷贝到机器A上,需要把机器B文件夹加上机器A的用户权限。
3
/// 这两个方法是对机器B建立连接,连接成功后,用File.Copy就可以了
4
///if (Ping("机器B"))
5
/// {
6
/// if (Connect("机器B","机器A用户","机器A用户访问密码"))
7
/// {
8
/// File.Copy("\\机器B\文件路径\文件名称","机器A存放文件完整路径",true);
9
/// }
10
/// }
11
///
12
/// </summary>
13
public class Computer
14
{
15
public static bool Ping(string remoteHost)
16
{
17
bool Flag = false;
18
Process proc = new Process();
19
try
20
{
21
proc.StartInfo.FileName = "cmd.exe";
22
proc.StartInfo.UseShellExecute = false;
23
proc.StartInfo.RedirectStandardInput = true;
24
proc.StartInfo.RedirectStandardOutput = true;
25
proc.StartInfo.RedirectStandardError = true;
26
proc.StartInfo.CreateNoWindow = true;
27
proc.Start();
28
string dosLine = @"ping -n 1 " + remoteHost;
29
proc.StandardInput.WriteLine(dosLine);
30
proc.StandardInput.WriteLine("exit");
31
while (proc.HasExited == false)
32
{
33
proc.WaitForExit(500);
34
}
35
string pingResult = proc.StandardOutput.ReadToEnd();
36
if (pingResult.IndexOf("(0% loss)") != -1)
37
{
38
Flag = true;
39
}
40
proc.StandardOutput.Close();
41
}
42
catch (Exception ex)
43
{
44
}
45
finally
46
{
47
try
48
{
49
proc.Close();
50
proc.Dispose();
51
}
52
catch
53
{
54
}
55
}
56
return Flag;
57
}
58
59
public static bool Connect(string remoteHost, string userName, string passWord)
60
{
61
if (!Ping(remoteHost))
62
{
63
return false;
64
}
65
bool Flag = true;
66
Process proc = new Process();
67
try
68
{
69
proc.StartInfo.FileName = "cmd.exe";
70
proc.StartInfo.UseShellExecute = false;
71
proc.StartInfo.RedirectStandardInput = true;
72
proc.StartInfo.RedirectStandardOutput = true;
73
proc.StartInfo.RedirectStandardError = true;
74
proc.StartInfo.CreateNoWindow = true;
75
proc.Start();
76
string dosLine = @"net use \\" + remoteHost + " " + passWord + " " + " /user:" + userName + ">NUL";
77
proc.StandardInput.WriteLine(dosLine);
78
proc.StandardInput.WriteLine("exit");
79
while (proc.HasExited == false)
80
{
81
proc.WaitForExit(1000);
82
}
83
string errormsg = proc.StandardError.ReadToEnd();
84
if (errormsg != "")
85
{
86
Flag = false;
87
}
88
proc.StandardError.Close();
89
}
90
catch (Exception ex)
91
{
92
Flag = false;
93
}
94
finally
95
{
96
try
97
{
98
proc.Close();
99
proc.Dispose();
100
}
101
catch
102
{
103
}
104
}
105
return Flag;
106
}
107
108
}
/// <summary>2
/// 比如,从机器A操作实现把机器B的文件拷贝到机器A上,需要把机器B文件夹加上机器A的用户权限。 3
/// 这两个方法是对机器B建立连接,连接成功后,用File.Copy就可以了 4
///if (Ping("机器B")) 5
/// { 6
/// if (Connect("机器B","机器A用户","机器A用户访问密码")) 7
/// { 8
/// File.Copy("\\机器B\文件路径\文件名称","机器A存放文件完整路径",true); 9
/// } 10
/// } 11
///12
/// </summary>13
public class Computer14
{15
public static bool Ping(string remoteHost)16
{17
bool Flag = false;18
Process proc = new Process();19
try20
{21
proc.StartInfo.FileName = "cmd.exe";22
proc.StartInfo.UseShellExecute = false;23
proc.StartInfo.RedirectStandardInput = true;24
proc.StartInfo.RedirectStandardOutput = true;25
proc.StartInfo.RedirectStandardError = true;26
proc.StartInfo.CreateNoWindow = true;27
proc.Start();28
string dosLine = @"ping -n 1 " + remoteHost;29
proc.StandardInput.WriteLine(dosLine);30
proc.StandardInput.WriteLine("exit");31
while (proc.HasExited == false)32
{33
proc.WaitForExit(500);34
}35
string pingResult = proc.StandardOutput.ReadToEnd();36
if (pingResult.IndexOf("(0% loss)") != -1)37
{38
Flag = true;39
}40
proc.StandardOutput.Close();41
}42
catch (Exception ex)43
{44
}45
finally46
{47
try48
{49
proc.Close();50
proc.Dispose();51
}52
catch53
{54
}55
}56
return Flag;57
}58

59
public static bool Connect(string remoteHost, string userName, string passWord)60
{61
if (!Ping(remoteHost))62
{63
return false;64
}65
bool Flag = true;66
Process proc = new Process();67
try68
{69
proc.StartInfo.FileName = "cmd.exe";70
proc.StartInfo.UseShellExecute = false;71
proc.StartInfo.RedirectStandardInput = true;72
proc.StartInfo.RedirectStandardOutput = true;73
proc.StartInfo.RedirectStandardError = true;74
proc.StartInfo.CreateNoWindow = true;75
proc.Start();76
string dosLine = @"net use \\" + remoteHost + " " + passWord + " " + " /user:" + userName + ">NUL";77
proc.StandardInput.WriteLine(dosLine);78
proc.StandardInput.WriteLine("exit");79
while (proc.HasExited == false)80
{81
proc.WaitForExit(1000);82
}83
string errormsg = proc.StandardError.ReadToEnd();84
if (errormsg != "")85
{86
Flag = false;87
}88
proc.StandardError.Close();89
}90
catch (Exception ex)91
{92
Flag = false;93
}94
finally95
{96
try97
{98
proc.Close();99
proc.Dispose();100
}101
catch102
{103
}104
}105
return Flag;106
}107

108
}

订阅本站,阅读更多文章