我有一个类需要知道当前有效用户的名称。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"
...我可以控制模拟代码,但我更愿意让它独立于解决方案的其他部分。
发布于 2011-03-01 11:51:29
好的,似乎是出现了属性模拟登录类型的问题。
如果在非个性化代码中,将LOGON32_LOGON_NEW_CREDENTIALS (9)替换为LOGON32_LOGON_INTERACTIVE (2),则一切正常-- WindowsIdentity.GetCurrent().Name和Environment.UserName都按预期返回ImpersonatedUser。
发布于 2011-03-01 10:25:34
只有这个(实例成员)
WindowsIdentity.Namehttp://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标识下运行时,它将访问资源作为次要标识。
https://stackoverflow.com/questions/5153161
复制相似问题