我有一个类需要知道当前有效的用户名。 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"
...
我可以控制模拟代码,但我更愿意将其与解决方案的其他部分保持独立。
答案 0 :(得分:6)
就是这个(实例成员)
WindowsIdentity.Name
http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx
您甚至不必调用Impersonate()。
无法访问或了解模仿,
WindowsIdentity.GetCurrent(false).Name
(same as)
WindowsIdentity.GetCurrent().Name
应该有效。 http://msdn.microsoft.com/en-us/library/x22bbxz6.aspx
false如果线程模拟,则返回线程的WindowsIdentity,如果线程当前没有模拟,则返回进程的WindowsIdentity。
<小时/> 如果您使用的是LOGON32_LOGON_NEW_CREDENTIALS,请记住(http://www.pcreview.co.uk/forums/logonuser-issues-t1385578.html)登录的上下文保持不变,而为远程资源创建第二个令牌 - 这就是您的WindowsIdentity.Name保持不变的原因 - 实际上它仍然是正确的,因为你没有实际模仿身份,所以你拥有的只是一个令牌来访问资源作为辅助身份,而整个程序/线程仍在
original
Windows身份下运行。
答案 1 :(得分:3)
好吧,问题似乎是属性非个性化登录类型。
如果在非人格化代码中将LOGON32_LOGON_NEW_CREDENTIALS
(9)替换为LOGON32_LOGON_INTERACTIVE
(2),一切正常 - WindowsIdentity.GetCurrent().Name
和Environment.UserName
都会按预期返回ImpersonatedUser。