使用Logindata c#WinServices在窗口服务上运行程序
我正在编写一个应用程序和一个服务,充当ClientServer系统。客户端正在向服务器提交数据,服务器正在调用第三方应用程序。在第三方应用程序需要访问我们的网络驱动器之前,这一切都可以正常工作。只要第三方库从调用方(LocalService)继承登录数据,并且LocalService不是域的一部分,应用程序就无法访问我们的网络驱动器。因此,尝试在客户端获取用户域数据(这不是问题),并在服务器上使用使用Logindata c#WinServices在窗口服务上运行程序,c#,.net,windows-services,client-server,advapi32,C#,.net,Windows Services,Client Server,Advapi32,我正在编写一个应用程序和一个服务,充当ClientServer系统。客户端正在向服务器提交数据,服务器正在调用第三方应用程序。在第三方应用程序需要访问我们的网络驱动器之前,这一切都可以正常工作。只要第三方库从调用方(LocalService)继承登录数据,并且LocalService不是域的一部分,应用程序就无法访问我们的网络驱动器。因此,尝试在客户端获取用户域数据(这不是问题),并在服务器上使用ProcessInfo模拟进程,但失败了。在短时间的谷歌搜索后,我发现无法在windows服务中使用
ProcessInfo
模拟进程,但失败了。在短时间的谷歌搜索后,我发现无法在windows服务中使用ProcessInfo.Username
和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());
}
}
这工作正常,但当我查看服务器TaskManager时,发现第三方应用程序的新进程仍在运行,且“用户名”为“本地服务”。该过程现在是否使用给定的登录数据“模拟”了?我找到了解决方案 我将dwLogonFlags设置为2,即meens LOGON\u NETCREDENTIALS\u仅当您这样做时,您的行为才像此用户,但当您调用
Environment.UserName
时,否则您将获得调用者。现在,我切换到使用配置文件登录,因此系统正在从域下载hole用户。。。这在第一次使用时需要一点时间,但该过程现在已完全模拟