使用 Logindata c# WinServices 在窗口服务上运行程序
本文关键字:服务 运行 程序 窗口 Logindata WinServices 使用 | 更新日期: 2023-09-27 17:56:16
我编写一个应用程序和一个充当客户端<>服务器系统的服务。客户端正在向服务器提交数据,服务器正在调用第三方应用程序,该应用程序工作正常,直到第三方应用程序需要访问我们的网络驱动器。只要第三方库从调用方(本地服务)继承登录数据,并且本地服务不是域的一部分,该应用程序就无法访问我们的网络驱动器。因此,尝试在客户端中获取用户域数据(这不是问题)并在服务器上使用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());
}
}
这工作正常,但是当我查看服务器任务管理器时,看到第三方应用程序的新进程仍在运行,"用户名"="本地服务"。该进程现在是否使用给定的登录数据"模拟"
我为此找到了解决方案。
我将 dwLogonFlags 设置为 2,这意味着LOGON_NETCREDENTIALS_ONLY如果您这样做,您只会像这个用户一样行事,但如果您在呼叫Environment.UserName
时,否则您将获得呼叫者。 现在我切换到LOGON_WITH_PROFILE所以系统正在从域下载孔用户......这在第一次使用时需要一点时间,但该过程现在完全模拟。