/// <summary> /// 以某一权限开始执行一个进程 /// </summary> /// <param name="programFullName">程序路径(全名)</param> /// <param name="level">级别(c/受限的,u/不信任的,n/正常用户)</param> /// <param name="commandArgs">命令行参数</param> /// <returns></returns> public int StartProcess(string programFullName, string level, string commandArgs, bool isHide) { int saferLevel = getRightLevel(level); int status = 0; IntPtr authzLevel = IntPtr.Zero; if (SafeNativeMethods.SaferCreateLevel(SafeNativeMethods.SAFER_SCOPEID_USER, saferLevel, 0, ref authzLevel, IntPtr.Zero) != 0) { IntPtr token = IntPtr.Zero; if (SafeNativeMethods.SaferComputeTokenFromLevel(authzLevel, IntPtr.Zero, out token, 0, IntPtr.Zero) != 0) { STARTUPINFO si = new STARTUPINFO(); si.dwFlags = STARTF.STARTF_USESHOWWINDOW; si.wShowWindow = isHide ? WindowShowStyle.Hide : WindowShowStyle.ShowNormal; si.cb = Marshal.SizeOf(typeof(STARTUPINFO)); PROCESS_INFORMATION pi; if (SafeNativeMethods.CreateProcessAsUser(token, null, getCommandLine(programFullName, commandArgs), IntPtr.Zero, IntPtr.Zero, 0, SafeNativeMethods.CREATE_NEW_CONSOLE, IntPtr.Zero, IntPtr.Zero, ref si, out pi) != 0)//这里CreateProcessAsUser的lpApplicationName置空,仅使用commandLine参数来启动程序。 { SafeNativeMethods.CloseHandle(pi.hProcess); SafeNativeMethods.CloseHandle(pi.hThread); } else { status = Marshal.GetLastWin32Error(); } } else { status = Marshal.GetLastWin32Error(); } SafeNativeMethods.SaferCloseLevel(authzLevel); } else { status = Marshal.GetLastWin32Error(); } return status; }
public static extern int CreateProcessAsUser(IntPtr hToken, string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, int bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, IntPtr lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);