zza*_*ndy 6 .net impersonation
我有一个类需要知道当前有效的用户名.Environment.UserName
或是WindowsIdentity.GetCurrent().Name
为了那个.但是当启用模拟时,它们返回的LocalUser
名称不是ImpersonatedUser
名称.
如何获取当前模拟用户的姓名?
该应用程序是C#控制台应用程序,我知道模仿是有效的,因为我获得了特权ImpersonatedUser
.当然,我可以使用模拟代码将模拟的用户名保存到某个全局变量,但这样做是错误的.
更新:
模拟代码:
if (LogonUser(userName, domain, password, LOGON32_LOGON_NEW_CREDENTIALS/*=9*/, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
WindowsIdentity tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
_impersonationContext = tempWindowsIdentity.Impersonate();
// WindowsIdentity.GetCurrent().Name equals "LocalUser"
// while userName equals "ImpersonatedUser"
...
Run Code Online (Sandbox Code Playgroud)
我可以控制模拟代码,但我更愿意将其与解决方案的其他部分保持独立.
就是这个(实例成员)
WindowsIdentity.Name
Run Code Online (Sandbox Code Playgroud)
http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx
你甚至不必调用Impersonate().
如果没有访问或了解模仿,
WindowsIdentity.GetCurrent(false).Name
(same as)
WindowsIdentity.GetCurrent().Name
Run Code Online (Sandbox Code Playgroud)
应该管用. http://msdn.microsoft.com/en-us/library/x22bbxz6.aspx
false如果模拟的话,则返回线程的WindowsIdentity;如果线程当前没有模拟,则返回进程的WindowsIdentity.
original
Windows 下运行身份.
好的,看来问题出在属性非个性化登录类型上。
如果在非个性化代码中将LOGON32_LOGON_NEW_CREDENTIALS
(9) 替换为LOGON32_LOGON_INTERACTIVE
(2),则一切正常 -WindowsIdentity.GetCurrent().Name
并且Environment.UserName
都按预期返回 ImpersonatedUser。
归档时间: |
|
查看次数: |
6427 次 |
最近记录: |