机器A和机器B处于不同的域中。机器A使用VPN来访问机器B的网络。
我试图模仿一个用户,目的是使用Microsoft.Web.Adminstration
在机器B上的IIS中执行一些管理工作。
我开始在asp.net mvc项目中执行此操作,但是当第一个解决方案要求我调用CoInitializeSecurity
时切换到控制台应用程序,显然,它要求事先没有调用它,我不知道如何防止它在一个mvc项目中(在控制台应用程序中,我只需要禁用Visual Studio托管过程)。
我应该提一下,我能够使用NetworkCredential
类与NetworkConnection
类(https://gist.github.com/AlanBarber/92db36339a129b94b7dd)连接到目标机器并写入文件。所以我完全知道用户/传递工作,我能够从客户端机器上使用它们进行文件访问。我只是无法弄清楚如何冒充他们。
我认为我不能立即给予奖励,但如果有人能够提供解决方案,我会尽快添加赏金给你。
我不确定你要做什么,我想你想要在VPN tunel中使用“作为用户”的一些代码,而不是你用来登录的用户,我是否正确?
如果是这样你需要“冒充”,你可以尝试使用“运行方式”执行你的应用程序,然后执行你的代码,应该在VPN域上的用户执行(如果在你的电脑上授权)
然后,您可以继续使用“运行方式”方法或查看:
[DllImport("advapi32.DLL")]
public static extern bool ImpersonateLoggedOnUser(IntPtr hToken);
[DllImport("advapi32.DLL")]
public static extern bool RevertToSelf();
void SomeMethod()
{
IntPtr phToken = IntPtr.Zero;
ImpersonateLoggedOnUser(phToken);
//... some code
RevertToSelf();
}
关于硬编码用户名的糟糕之处在于
另一种选择是使用Windows凭证管理器(键入凭证管理器或从控制面板打开它),您将看到类似这样的内容。继续尝试查看您的目标是否可以使用此凭据提供程序进行配置。你会添加这样的东西,如果你需要一个端口,不要忘记端口,示例显示远程服务器到SQL服务器的可信连接。如果您发现这有效,那么您可以通过credentials manager API as answered here管理用户。我会提示用户输入用户名和密码,并在连接失败时存储它们。
也许这会有所帮助,我有一个使用类似方法的解决方案。
进口
using System.Security.Principal;
using System.Runtime.InteropServices;
private const int LOGON32_LOGON_INTERACTIVE = 2;
private const int LOGON32_PROVIDER_DEFAULT = 0;
static WindowsImpersonationContext impersonationContext;
[DllImport("advapi32.dll")]
public static extern int LogonUserA(string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);
方法:
static private bool impersonateValidUser(string userName, string domain, string password)
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if (RevertToSelf())
{
if (LogonUserA(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();
if (impersonationContext != null)
{
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
}
}
}
}
if (token != IntPtr.Zero)
CloseHandle(token);
if (tokenDuplicate != IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
}
static private void undoImpersonation()
{
impersonationContext.Undo();
}
我希望这能让你到达那里!