0

我正在编写一个应用程序和一个充当客户端<->服务器系统的服务。客户端正在向服务器提交数据,服务器正在调用第 3 方应用程序。在第 3 方应用程序需要访问我们的网络驱动器之前工作正常。只要第 3 方库从调用者 (LocalService) 继承登录数据并且 LocalService 不是域的一部分,应用程序就无法访问我们的网络驱动器。因此尝试在客户端获取用户域数据(这不是问题)并ProcessInfo在服务器上模拟进程,但这失败了。经过短暂的谷歌搜索后,我发现无法在 Windows 服务中使用ProcessInfo.Usernameand ProcessInfo.Password,所以我使用了 advapi32 函数CreateProcessWithLogonW

public void Exec(string strProcessFilename, string strCommand, DomainUser user)
{
    string @path = Path.GetDirectoryName(strProcessFilename);
    // Declare variables
    PROCESS_INFORMATION pi;

    var si = new STARTUPINFO { wShowWindow = 0 };
    // Initialize structs
    si.cb = Marshal.SizeOf(si);

    // login and start process
    if (CreateProcessWithLogonW(user.UserName, user.Domain, user.Password, 2, strProcessFilename, string.Format("{0} {1}", 0, strCommand), 1536, IntPtr.Zero, @path, ref si, out pi))
    {
        WaitForSingleObject(pi.hProcess, INFINITE);
        //var process = Process.GetProcessById(pi.dwProcessId);
        //process.WaitForExit();
    }
    else
    {
        throw new Exception("Failed login error: " + Marshal.GetLastWin32Error());
    }
}

这工作正常,但是当我查看服务器任务管理器时,发现第 3 方应用程序的新进程仍在使用“用户名”=“本地服务”运行。现在是否使用给定的登录数据“模拟”了该过程?

4

1 回答 1

0

我找到了解决方案。

我将 dwLogonFlags 设置为 2 表示 LOGON_NETCREDENTIALS_ONLY 如果你这样做,你只会像这个用户一样行事,但如果你在打电话时Environment.UserName,否则你会得到来电者。现在我切换到 LOGON_WITH_PROFILE,所以系统正在从域下载洞用户......这在第一次使用时需要一些时间,但现在该过程已完全模拟。

于 2014-04-03T08:34:24.087 回答