我使用类似下面的方法来模拟我的代码中的用户:
在另一个类中,我需要找出当前用户(如"mydomain\moose"),但我不知道我是否正在冒充其他用户.
如果我冒充某人,我如何获得用户名?
System.Environment.UserName和System.Security.Principal.WindowsIdentity.GetCurrent().Name都返回原始用户,而不是当前模拟的用户.
更多细节:
我正在进行此模拟,以便我可以访问用户通常无权访问的netowrk共享中的某些文件.
如果我使用登录类型的LOGON32_LOGON_INTERACTIVE,我确实看到了新用户,但我无法访问网络共享.如果我使用登录类型的LOGON32_LOGON_NEW_CREDENTIALS(值为9),我可以访问网络共享但我没有在Environment.UserName中看到新用户.
Han*_*ans 20
开始编辑: 我意识到我第一次回答这个问题并不是很清楚.所以,我想开始另一次尝试:
首先,我想指出WindowsIdentity.GetCurrent().Name如果您使用LOGON32_LOGON_NEW_CREDENTIALS或LOGON32_LOGON_INTERACTIVE作为LogonUser(在模拟类内部)函数的登录类型,属性将返回什么:
运用 LOGON32_LOGON_INTERACTIVE
// Assuming this code runs under USER_B
using (var imp = new Impersonation("treyresearch", "USER_A", "SecurePwd", LOGON32_LOGON_INTERACTIVE ))
{
// Now, we run under USER_A
Console.Out.WriteLine(WindowsIdentity.GetCurrent().Name); // Will return USER_A
}
Run Code Online (Sandbox Code Playgroud)运用 LOGON32_LOGON_NEW_CREDENTIALS
// Assuming this codes runs under USER_B
using (var imp = new Impersonation("treyresearch", "USER_A", "SecurePwd", LOGON32_LOGON_NEW_CREDENTIALS ))
{
Console.Out.WriteLine(WindowsIdentity.GetCurrent().Name); // Will return USER_B
}
Run Code Online (Sandbox Code Playgroud)这是您在问题中描述的行为,并且与MSDN上的LogonUser功能描述一致.对于LOGON32_LOGON_NEW_CREDENTIALS创建的用户令牌,它只是当前用户令牌的克隆.这意味着创建的用户会话具有与调用线程相同的标识符.传递给该LogonUser功能的凭据仅用于出站网络连接.
其次,让我指出了两次情况之间的差异说明LOGON32_LOGON_INTERACTIVE,并LOGON32_LOGON_NEW_CREDENTIALS变得清晰:
您在computer_A上运行程序(在user_A帐户下).您模拟user_B(使用LOGON32_LOGON_INTERACTIVE).然后,您连接到computer_B上的网络共享,并尝试将文件复制到本地文件夹(只有user_A有权写入此文件夹).然后,您将收到拒绝访问错误消息,因为文件操作是使用user_B的权限完成的,该权限对本地文件夹没有权限.
与上述情况相同.但现在,我们LOGON32_LOGON_NEW_CREDENTIALS用来模仿user_B.我们连接到网络驱动器并将文件从网络驱动器复制到本地文件夹.在这种情况下,操作成功,因为文件操作是使用user_A的权限完成的.
结束编辑
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
14686 次 |
| 最近记录: |