c# WinServices 使用 Logindata 在窗口服务上运行程序
Posted
技术标签:
【中文标题】c# WinServices 使用 Logindata 在窗口服务上运行程序【英文标题】:Run a Program on a Window Service with Logindata c# WinServices 【发布时间】:2014-04-03 07:35:00 【问题描述】:我正在编写一个应用程序和一个充当客户端服务器系统的服务。客户端正在向服务器提交数据,服务器正在调用第 3 方应用程序。在第 3 方应用程序需要访问我们的网络驱动器之前工作正常。只要第 3 方库从调用者 (LocalService) 继承登录数据并且 LocalService 不是域的一部分,应用程序就无法访问我们的网络驱动器。因此尝试在客户端获取用户域数据(这不是问题)并在服务器上使用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());
这工作正常,但是当我查看服务器任务管理器时,发现第 3 方应用程序的新进程仍在以“用户名”=“本地服务”运行。该进程现在是否使用给定的登录数据“模拟”?
【问题讨论】:
【参考方案1】:我找到了解决方案。
我将 dwLogonFlags 设置为 2 表示 LOGON_NETCREDENTIALS_ONLY 如果你这样做,你只会像这个用户一样行事,但如果你打电话给Environment.UserName
,否则你会得到来电者。现在我切换到 LOGON_WITH_PROFILE,所以系统正在从域中下载洞用户......这在第一次使用时需要一些时间,但现在该过程已完全模拟。
【讨论】:
以上是关于c# WinServices 使用 Logindata 在窗口服务上运行程序的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# GUI 调用 C# 控制台应用程序 [重复]