2

我很难找到有关这种方法的大量信息,所以我想我会在这里问一下,看看你们这些优秀的人是否可以提供帮助。

我们基本上拥有的是这个......

[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);

if (LogonUser(AdminDevUser,
              AdminDevDomain, 
              AdminDevPassword,
              8, // LOGON32_LOGON_NETWORK_CLEARTEXT    
              0, // LOGON32_PROVIDER_DEFAULT    
              out token))
{
    wi = new WindowsIdentity(token);
    WindowsImpersonationContext wic = wi.Impersonate();
    blnFileExists = File.Exists(strFileName);
    wic.Undo();
    CloseHandle(token);
    return blnFileExists;
}
else
{
    throw new Exception(Marshal.GetLastWin32Error().ToString());
    //Console.WriteLine("LogonUser() failed with error code " + Marshal.GetLastWin32Error());
}

写这篇文章的人已经不在了,所以我试图弄清楚需要什么来完成这项工作。我的假设是 loginUser 方法只是模拟从该 Web 服务器登录到网络的给定登录信息......然后在 Impersonate 之后完成的任何后续调用都将完成,就好像该用户正在执行它们而不是登录到网络的任何人一样服务器。正确的?

我们从 throw 行中得到一个错误,如下所示:

87 说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息:System.Exception:87

4

1 回答 1

0

简短回答:您是对的,您需要 WRM/WSM 在远程计算机上执行与上述代码相同的操作。

有关您尝试在上面使用的 API 的更多详细信息:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa378184%28v=vs.85%29.aspx

“...您不能使用 LogonUser 登录到远程计算机...”和“如果(...)成功,您将收到代表已登录用户的令牌的句柄。然后您可以使用此令牌处理冒充(...)”


要测试远程系统上是否存在文件(可能稍后再读取它?),我建议共享该文件或其包含文件夹,或使用服务器-客户端连接(例如套接字)。

解决问题的复杂方法是​​使用 Windows 远程管理。您可以在这里找到一个很好的起点:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa384423%28v=vs.85%29.aspx

希望这可以帮助!

于 2013-04-19T12:57:45.980 回答