.NET:如何使用C#中的STARTUPINFOEX调用CreateProcessAsUser()

Web上用于调用CreateProcessAsUser()的大多数示例代码都具有与以下类似的PInvoke签名:

public static extern bool CreateProcessAsUser(IntPtr hToken, string lpApplicationName, string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes, ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandles, int creationFlags, IntPtr environment, string currentDirectory, ref STARTUPINFO startupInfo, out PROCESS_INFORMATION processInfo); 

问题是,我想通过STARTUPINFOEX,这在Vista / W7中是允许的。 如果我正在编写C / C ++那么我就可以投出它。

我应该如何在C#中处理这个问题? STARTUPINFOEX看起来像这样:

  [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFOEX { public STARTUPINFO StartupInfo; public IntPtr lpAttributeList; }; 

我应该将IntPtr传递给结构吗? 如果我改变Pinvoke签名并做这样的事情……

  IntPtr pStartupInfoEx = Marshal.AllocHGlobal(Marshal.SizeOf(startupInfoEx)); Marshal.StructureToPtr(startupInfoEx, pStartupInfoEx, true); 

..当我执行CreateProcessAsUser()时崩溃我的shell 🙁

任何想法都感激不尽。 谢谢。

我认为你应该像STARTUPINFO一样传递它,我的意思是使用ref关键字。 结构的编组方式与STARTUPINFO完成的方式相同。