使用 Logindata c# WinServices 在窗口服务上运行程序

本文关键字:服务 运行 程序 窗口 Logindata WinServices 使用 | 更新日期: 2023-09-27 17:56:16

我编写一个应用程序和一个充当客户端<>服务器系统的服务。客户端正在向服务器提交数据,服务器正在调用第三方应用程序,该应用程序工作正常,直到第三方应用程序需要访问我们的网络驱动器。只要第三方库从调用方(本地服务)继承登录数据,并且本地服务不是域的一部分,该应用程序就无法访问我们的网络驱动器。因此,尝试在客户端中获取用户域数据(这不是问题)并在服务器上使用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());
    }
}

这工作正常,但是当我查看服务器任务管理器时,看到第三方应用程序的新进程仍在运行,"用户名"="本地服务"。该进程现在是否使用给定的登录数据"模拟"

使用 Logindata c# WinServices 在窗口服务上运行程序

我为此找到了解决方案。

我将 dwLogonFlags 设置为 2,这意味着LOGON_NETCREDENTIALS_ONLY如果您这样做,您只会像这个用户一样行事,但如果您在呼叫Environment.UserName时,否则您将获得呼叫者。 现在我切换到LOGON_WITH_PROFILE所以系统正在从域下载孔用户......这在第一次使用时需要一点时间,但该过程现在完全模拟。