Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Logindata c#WinServices在窗口服务上运行程序_C#_.net_Windows Services_Client Server_Advapi32 - Fatal编程技术网

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

使用Logindata c#WinServices在窗口服务上运行程序,c#,.net,windows-services,client-server,advapi32,C#,.net,Windows Services,Client Server,Advapi32,我正在编写一个应用程序和一个服务,充当ClientServer系统。客户端正在向服务器提交数据,服务器正在调用第三方应用程序。在第三方应用程序需要访问我们的网络驱动器之前,这一切都可以正常工作。只要第三方库从调用方(LocalService)继承登录数据,并且LocalService不是域的一部分,应用程序就无法访问我们的网络驱动器。因此,尝试在客户端获取用户域数据(这不是问题),并在服务器上使用ProcessInfo模拟进程,但失败了。在短时间的谷歌搜索后,我发现无法在windows服务中使用

我正在编写一个应用程序和一个服务,充当ClientServer系统。客户端正在向服务器提交数据,服务器正在调用第三方应用程序。在第三方应用程序需要访问我们的网络驱动器之前,这一切都可以正常工作。只要第三方库从调用方(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());
    }
}

这工作正常,但当我查看服务器TaskManager时,发现第三方应用程序的新进程仍在运行,且“用户名”为“本地服务”。该过程现在是否使用给定的登录数据“模拟”了?

我找到了解决方案

我将dwLogonFlags设置为2,即meens LOGON\u NETCREDENTIALS\u仅当您这样做时,您的行为才像此用户,但当您调用
Environment.UserName
时,否则您将获得调用者。现在,我切换到使用配置文件登录,因此系统正在从域下载hole用户。。。这在第一次使用时需要一点时间,但该过程现在已完全模拟