从 CreateProcessWithTokenW 获取 C# 中的 Process 对象

Posted

技术标签:

【中文标题】从 CreateProcessWithTokenW 获取 C# 中的 Process 对象【英文标题】:Get a Process objet in C# from CreateProcessWithTokenW 【发布时间】:2020-04-08 17:52:29 【问题描述】:

为了我的应用程序的需要,我使用 CreateProcessWithTokenW https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createprocesswithtokenw 创建了一个进程 这有助于我在桌面用户下运行进程,因为我的应用程序在管理员用户下运行

在我使用 C# 进程处理我的进程并获取输出等之前...

使用 CreateProcessWithTokenW 创建进程后如何获取进程?他们是我返回的 StartUPINFO 中的一些 IntPtr,但我不知道如何使用它来获取进程。

我的结构是

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        private struct STARTUPINFO
        
            public Int32 cb;
            public string lpReserved;
            public string lpDesktop;
            public string lpTitle;
            public Int32 dwX;
            public Int32 dwY;
            public Int32 dwXSize;
            public Int32 dwYSize;
            public Int32 dwXCountChars;
            public Int32 dwYCountChars;
            public Int32 dwFillAttribute;
            public Int32 dwFlags;
            public Int16 wShowWindow;
            public Int16 cbReserved2;
            public IntPtr lpReserved2;
            public IntPtr hStdInput;
            public IntPtr hStdOutput;
            public IntPtr hStdError;
        

我有点明白我有一些 Ptr 来输出输入等...但我不知道如何让我的流程恢复任何想法?

【问题讨论】:

句柄在 PPROCESS_INFORMATION 内部处理 - 这是 out 参数。 STARTUPINFOin 唯一参数 - 看这里没有意义。根据您的任务,您需要调用CreateProcessAsUserW 而不是CreateProcessWithTokenW 我有点关注微软文档blogs.msdn.microsoft.com/aaron_margosis/2009/06/06/…,但它可能有点过时了。是的,我刚刚用PROCESS_INFORMATION 成功了,所以我会回答自己并将其标记为已解决,感谢您的快速回答 【参考方案1】:

我不是在找好地方。现在你使用我的方法发回的 PROCESS_INFORMATION 他们里面是一个进程 ID,我可以用这个简单的代码返回它

var res = ProcessHelper.RunAsDesktopUser(fileName, opt);
var process = Process.GetProcessById(res.dwProcessId);

我已经测试过了,它工作得很好。

【讨论】:

你不需要GetProcessById,因为你已经在PROCESS_INFORMATION里面有进程句柄 我需要它,因为在我使用了一些与我的进程关联的 C# 事件后,我只需返回我创建的进程以与之交互 我的代码使用了 C# 类 Process 的一些功能,所以我不确定你所说的进程句柄是什么意思,但我需要我的类对象,所以我可以保留我的旧代码。跨度>

以上是关于从 CreateProcessWithTokenW 获取 C# 中的 Process 对象的主要内容,如果未能解决你的问题,请参考以下文章

在 CMD 中使用 CreateProcessWithTokenW 启动 CMD

创建新进程,就三个函数CreateProcessAsUser CreateProcessWithLogonW CreateProcessWithTokenW(附网友的流程)

PROCESS_INFORMATION structure(机翻)

从 NIB 与从代码加载自定义滑块:从代码加载时不存在子视图

如何从其他面板从 JTextField 获取输入

从PRISM开始学WPFMVVMViewModel?