/// <summary> /// !!! to be checked /// </summary> /// <param name="appPath"></param> /// <param name="cmdLine"></param> /// <param name="workDir"></param> /// <param name="visible"></param> /// <returns></returns> public static bool StartProcessAsCurrentUser(string appPath, string cmdLine = null, string workDir = null, bool visible = true) { var hUserToken = IntPtr.Zero; Advapi32.STARTUPINFO startInfo = new Advapi32.STARTUPINFO(); WinApi.Advapi32.PROCESS_INFORMATION procInfo = default; var pEnv = IntPtr.Zero; int iResultOfCreateProcessAsUser; startInfo.cb = Marshal.SizeOf(typeof(Advapi32.STARTUPINFO)); try { if (!getActiveSessionUserToken(ref hUserToken)) { throw new Exception("StartProcessAsCurrentUser: GetSessionUserToken failed."); } Advapi32.CreationFlags dwCreationFlags = Advapi32.CreationFlags.CREATE_UNICODE_ENVIRONMENT | (visible ? Advapi32.CreationFlags.CREATE_NEW_CONSOLE : Advapi32.CreationFlags.CREATE_NO_WINDOW); startInfo.wShowWindow = (short)(visible ? User32.SW.SW_SHOW : User32.SW.SW_HIDE); //startInfo.lpDesktop = "winsta0\\default"; if (!Userenv.CreateEnvironmentBlock(ref pEnv, hUserToken, false)) { throw new Exception("StartProcessAsCurrentUser: CreateEnvironmentBlock failed."); } if (!Advapi32.CreateProcessAsUser(hUserToken, appPath, // Application Name cmdLine, // Command Line null, null, false, dwCreationFlags, pEnv, workDir, // Working directory startInfo, procInfo)) { iResultOfCreateProcessAsUser = Marshal.GetLastWin32Error(); throw new Exception("StartProcessAsCurrentUser: CreateProcessAsUser failed. Error Code -" + iResultOfCreateProcessAsUser); } iResultOfCreateProcessAsUser = Marshal.GetLastWin32Error(); } finally { Kernel32.CloseHandle(hUserToken); if (pEnv != IntPtr.Zero) { Userenv.DestroyEnvironmentBlock(pEnv); } Kernel32.CloseHandle(procInfo.hThread); Kernel32.CloseHandle(procInfo.hProcess); } return(true); }
static uint createProcessAsUser(string cmdLine, IntPtr hToken, IntPtr envBlock) { try { WinApi.Advapi32.PROCESS_INFORMATION pi = new WinApi.Advapi32.PROCESS_INFORMATION(); WinApi.Advapi32.SECURITY_ATTRIBUTES saProcess = new WinApi.Advapi32.SECURITY_ATTRIBUTES(); WinApi.Advapi32.SECURITY_ATTRIBUTES saThread = new WinApi.Advapi32.SECURITY_ATTRIBUTES(); saProcess.Length = Marshal.SizeOf(saProcess); saThread.Length = Marshal.SizeOf(saThread); WinApi.Advapi32.STARTUPINFO si = new WinApi.Advapi32.STARTUPINFO(); si.cb = Marshal.SizeOf(si); //if this member is NULL, the new process inherits the desktop //and window station of its parent process. If this member is //an empty string, the process does not inherit the desktop and //window station of its parent process; instead, the system //determines if a new desktop and window station need to be created. //If the impersonated user already has a desktop, the system uses the //existing desktop. si.lpDesktop = @"WinSta0\Default"; //Modify as needed si.dwFlags = WinApi.Advapi32.STARTF.USESHOWWINDOW | WinApi.Advapi32.STARTF.FORCEONFEEDBACK; si.wShowWindow = WinApi.User32.SW_SHOW; if (!WinApi.Advapi32.CreateProcessAsUser( hToken, null, cmdLine, ref saProcess, ref saThread, false, WinApi.Advapi32.CreationFlags.CREATE_UNICODE_ENVIRONMENT, envBlock, null, ref si, out pi )) { throw new Exception("!CreateProcessAsUser. " + ErrorRoutines.GetLastError()); } return(pi.dwProcessId); } //catch(Exception e) //{ //} finally { } }