我在 C# 中模拟用户时遇到问题:
我模拟了数千个示例中使用的已知功能:
using(Impersonator impClass = new Impersonator(_domain, _userName, _password)) ...
模仿后我跑
System.Security.Principal.WindowsIdentity.GetCurrent().Name
并获得正确的(模拟的)用户。
所以模仿通常是有效的。
但是,如果我在模拟后打开运行空间(powershell),则会使用模拟前的旧用户。
这是我使用的一些代码:
using(Impersonator impClass = new Impersonator(_domain, _userName, _password))
{
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
logger.Debug("after imp windows: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
using (Pipeline pipeline = runspace.CreatePipeline())
{
List<Command> commandList = new List<Command>();
Command cmd = new Command("whoami");
commandList.Add(cmd);
foreach (Command command in commandList)
{
pipeline.Commands.AddScript(command.ToString()); pipeline.Commands.AddScript(command.ToString());
}
var res = pipeline.Invoke();
}
}
这是日志的内容:
Windows 身份:“impersonatedUser”<- 正确
来自 Powershell 的 WhoAmI:“NotImpersonatedUser”<- 不正确
我真的不知道我做错了什么。请帮忙,我已经浪费了这么多小时了......
这是我正在使用的模拟类的一部分:
private void ImpersonateValidUser(
string userName,
string domain,
string password)
{
WindowsIdentity tempWindowsIdentity = null;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
try
{
if (RevertToSelf())
{
if (LogonUser(
userName,
domain,
password),
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
}
else
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
else
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
else
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
finally
{
if (token != IntPtr.Zero)
{
CloseHandle(token);
}
if (tokenDuplicate != IntPtr.Zero)
{
CloseHandle(tokenDuplicate);
}
}
}