使用“CreateProcessAsUser”API创建的新进程是创建过程的子进程

时间:2014-05-22 22:08:26

标签: c#

我有一个Windows服务(进程 - x)启动另一个GUI应用程序(MVVM)(进程 - y)但是进程y是进程x的子进程。即使这些进程由于某种原因作为不同的用户帐户运行,正在为进程y创建的日志文件是在对进程x有效的位置创建的。 %USERPROFILE%环境变量正在日志文件的路径中使用。因此,对于运行为" LocalSystem"帐户环境变量正在评估为C:\ Windows \ SysWOW64 \ config \ systemprofile。对于作为当前登录窗口用户运行的进程y,正在评估环境变量以处理x​​的值而不是C:\ Users [loginID]。这是因为进程y是进程x的子进程。所以,我需要知道如何打破这种亲子关系。

我使用CreateProcessAsUser API从进程x创建进程y。

        // flags that specify the priority and creation method of the process
        int dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;

        // create a new process in the current user's logon session
        bool result = CreateProcessAsUser(usertoken,                                                        // client's access token
                                        null,                                                        // file to execute
                                        String.Format("{0} {1}", applicationName,  arguments),                     // command line
                                        ref sa,                                                                 // pointer to process SECURITY_ATTRIBUTES
                                        ref sa,                                                                 // pointer to thread SECURITY_ATTRIBUTES
                                        false,                                                                  // handles are not inheritable
                                        dwCreationFlags,                                                        // creation flags
                                        IntPtr.Zero,                                                            // pointer to new environment block 
                                        workingDirectory,                                                         // name of current directory 
                                        ref si,                                                                 // pointer to STARTUPINFO structure
                                        out procInfo                                                            // receives information about new process
                                        );

请告诉我如何删除亲子关系。

1 个答案:

答案 0 :(得分:1)

问题是CreateProcessAsUser仅使用给定用户的凭据(安全上下文)运行流程,但不使用任何配置文件信息。

MSDN页面http://msdn.microsoft.com/en-us/library/windows/desktop/ms682429(v=vs.85).aspx建议使用LoadUserProfileCreateEnvironmentBlock加载配置文件和环境块。