我正在编写一个应用程序和一个充当客户端<->服务器系统的服务。客户端正在向服务器提交数据,服务器正在调用第 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 方应用程序的新进程仍在使用“用户名”=“本地服务”运行。现在是否使用给定的登录数据“模拟”了该过程?