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.UsernameProcessInfo.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# - 使用自定义配置在运行时编译 c# 代码

创建可以从 c# 和 c++ 中使用的 c# dll

如何使用 C# GUI 调用 C# 控制台应用程序 [重复]

使用 C# 从 RLM 读取许可证文件(C++ 到 C# 的翻译)

如何在 C# 的泛型中使用扩展

使用托管 C++ 项目中的 C# 类