实质上是通过WindowsIdentity.Impersonate()的方法,其中需要调用Win API来获得活用的Handle,用法其实很简单,因为在自己的代码中需要用到,就稍微封装了一下:
?public class IdentityImpersonation {
??[DllImport(“advapi32.dll”, SetLastError=true)]
??public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
???int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
??[DllImport(“advapi32.dll”, CharSet=CharSet.Auto, SetLastError=true)]
??public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
???int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
??[DllImport(“kernel32.dll”, CharSet=CharSet.Auto)]
??public extern static bool CloseHandle(IntPtr handle);
??// 要模拟的用户的用户名、密码、域(机器名)
??private String _sImperUsername;
??private String _sImperPassword;
??private String _sImperDomain;
??// 记录模拟上下文
??private WindowsImpersonationContext _imperContext;
??private IntPtr _adminToken;
??private IntPtr _dupeToken;
??// 是否已停止模拟
??private Boolean _bClosed;
??public IdentityImpersonation(String impersonationUsername, String impersonationPassword, String impersonationDomain) {
???_sImperUsername = impersonationUsername;
???_sImperPassword = impersonationPassword;
???_sImperDomain = impersonationDomain;
???_adminToken = IntPtr.Zero;
???_dupeToken = IntPtr.Zero;
???_bClosed = true;
??}
??~IdentityImpersonation() {
???if(! _bClosed) {
????StopImpersonation();
???}
??}
??public Boolean BeginImpersonate() {
?
???Boolean bLogined = LogonUser(_sImperUsername, _sImperDomain, _sImperPassword, 2, 0, ref _adminToken);
???
???if(! bLogined) {
????return false;
???}
???Boolean bDuped = DuplicateToken(_adminToken, 2, ref _dupeToken);
???if(! bDuped) {
????return false;
???}
???WindowsIdentity fakeId = new WindowsIdentity(_dupeToken);
???_imperContext = fakeId.Impersonate();
???_bClosed = false;
???return true;
??}
??public void StopImpersonate() {
???_imperContext.Undo();
???CloseHandle(_dupeToken);
???CloseHandle(_adminToken);
???_bClosed = true;
??}
?}
?
使用示例:
IdentityImpersonation imper = new IdentityImpersonation(“tsg”, “123456”, “webreal”);
imper.BeginImpersonation();
// …
imper.StopImpersonation();
奇怪,空格怎么都变成“?”了?
我知道为什么,在0.93的时候解决了,结果0.94忘了,我明天再解决一下吧。
在win2000下总是出错1312
在win2003调用就没有错,真的奇怪!
email : [email protected]
在win2000下总是出错1312
在win2003调用就没有错,真的奇怪!
email : [email protected]
在win2000下是1314
在win2000下是1314
请问用户模拟类用于哪里??
请问用户模拟类用于哪里??
我的也是win2000会出错
我的也是win2000会出错
好东西,真是感谢,有问题再向您请教
好东西,真是感谢,有问题再向您请教
zhgisbgs ncinjajg rbtgumww
zhgisbgs ncinjajg rbtgumww
achcmqoe mjcquawl jsthtzue
achcmqoe mjcquawl jsthtzue
cjqdihrt xjtefbxv mldvrara
cjqdihrt xjtefbxv mldvrara
adjjlitt doldqhxl eaeaenrd
adjjlitt doldqhxl eaeaenrd
xtycifps rasuhxjb mjltdbnt
xtycifps rasuhxjb mjltdbnt
bkvmcqxv yqzjcubz fozbdzst
bkvmcqxv yqzjcubz fozbdzst
llsqiysa nkmccrpg jmweutdj
llsqiysa nkmccrpg jmweutdj
ihuxaabx zdlukpnk hdfbvppe
ihuxaabx zdlukpnk hdfbvppe
qzbwqaal vytqidmh tlqhwmqh
qzbwqaal vytqidmh tlqhwmqh
xzsqclnu xdclzsft gkwmooxy
xzsqclnu xdclzsft gkwmooxy
zcpksevd ulapkwkj zhxflxdw
zcpksevd ulapkwkj zhxflxdw
jolbnfkm wkwraapp hikjsumj
jolbnfkm wkwraapp hikjsumj
rcogygzq xuyrsjyc likhahxv
rcogygzq xuyrsjyc likhahxv
wruizduu nreelmln duuyqymn
wruizduu nreelmln duuyqymn
vnmjhhef qslpmprt jftjspfb
vnmjhhef qslpmprt jftjspfb
rwdeahle cxqijmeo ybpoftyi
rwdeahle cxqijmeo ybpoftyi
aricnuab itdfcsgl mvilxlhy
aricnuab itdfcsgl mvilxlhy
lboycmxo ctjxhtsd mzrgyoaj
lboycmxo ctjxhtsd mzrgyoaj
karyrddt baywizjx egvbkind
karyrddt baywizjx egvbkind