// Following http://blogs.msdn.com/b/winsdk/archive/2009/07/14/launching-an-interactive-process-from-windows-service-in-windows-vista-and-later.aspx . public static uint RunIt(String strCommand, String strDomain, String strName, String strPassword) { IntPtr hToken = IntPtr.Zero; uint pid = uint.MaxValue; try { Boolean result = Win32ProcessCall.LogonUser(strName, strDomain, strPassword, Win32ProcessCall.LogonType.LOGON32_LOGON_INTERACTIVE, Win32ProcessCall.LogonProvider.LOGON32_PROVIDER_DEFAULT, out hToken); if (!result) { throw new Exception("Logon error #" + Marshal.GetLastWin32Error()); } UInt32 dwSessionId = WTSGetActiveConsoleSessionId(); IntPtr newToken = IntPtr.Zero; //http://stackoverflow.com/questions/3128017/possible-to-launch-a-process-in-a-users-session-from-a-service CNU.RunAs.Alejacma.Win32ProcessCall.STARTUPINFO startInfo = new CNU.RunAs.Alejacma.Win32ProcessCall.STARTUPINFO(); startInfo.cb = Marshal.SizeOf(startInfo); IntPtr envBlock = ProcessAsUser.GetEnvironmentBlock(hToken); pid = ProcessAsUser.LaunchProcessAsUserPid(strCommand, hToken, envBlock); if (envBlock != IntPtr.Zero) { ProcessAsUser.DestroyEnvironmentBlock(envBlock); } } finally { Win32ProcessCall.CloseHandle(hToken); } return(pid); }
public void Perform() { var strtInfo = new ProcessStartInfo { FileName = _fileName, Arguments = String.Join(" ", _args) }; if (AsUser) { System.Threading.Thread.Sleep(TimeSpan.FromSeconds(30)); ProcessAsUser.Launch(String.Format("{0} {1}", _fileName, strtInfo.Arguments)); return; } if (HideWindow) { strtInfo.CreateNoWindow = true; strtInfo.WindowStyle = ProcessWindowStyle.Hidden; } if (AsAdmin) { strtInfo.UseShellExecute = true; strtInfo.RedirectStandardOutput = false; strtInfo.Verb = @"runas"; } else if (_waitForExit) { strtInfo.UseShellExecute = false; strtInfo.RedirectStandardOutput = true; } if (!String.IsNullOrEmpty(WorkingFolder)) { strtInfo.WorkingDirectory = WorkingFolder; } var pr = Process.Start(strtInfo); if (pr != null) { if (_waitForExit) { string output = pr.StandardOutput.ReadToEnd(); Trace.WriteLine(output); pr.WaitForExit(); } } else { throw new ExecuteCommandException { Step = this }; } }
internal static IEnumerable <IInstallationStep> GetUpdateProcedure(params string[] args) { // create tmp folder string installedDate = null; var tmpFolder = Path.GetTempPath(); var owner = ProcessAsUser.GetProcessOwner(Process.GetCurrentProcess().Id).ToLower(); bool bAsUser = owner.Contains("system"); Trace.WriteLine("SpareioInstaller owner=" + owner); var cmdArgs = new Utils.CmdLineArgs(args); bool bPreProd = cmdArgs.CheckArg("preprod"); string _token = String.Empty; _token = cmdArgs.CheckArg("xToken") ? cmdArgs.GetArgValue("xToken") : InstallUtils.ReadValue("xToken"); InitializeEventService(args); yield return(new GenerateInstallMachineIds()); yield return(new StopProcess(InstallUtils.WcProcessName)); yield return(new DownloadStep(tmpFolder, TimeSpan.FromMinutes(DownloadStep.UpdateTimeout), DownloadStep.UpdateRetry, args) { Validator = x => ZipUtils.IsZipValid(x) }); yield return(new UnInstallService(InstallService.ServiceName, InstallService.ExeName, true)); yield return(new UnzipStep(Path.Combine(tmpFolder, "Spareio.zip"), InstallUtils.GetInstallFolder())); yield return(new RemoveUninstallInfoStep { Installed = iDate => { installedDate = iDate; } }); yield return(new UninstallInfoStep { InstalledDate = installedDate }); yield return(new InstallService(InstallUtils.GetWcRunFolder())); yield return(new ExecuteCommandStep("sc.exe", new[] { "start", InstallService.ServiceName, !String.IsNullOrEmpty(_token) ? _token : "" }) { HideWindow = true }); //yield return new RunSpareio(Path.Combine(InstallUtils.GetWcRunFolder(), "Spareio.exe")) { silent = true, preprod = bPreProd, update = true, InitMessage = "Applying update for distributed components..." }; yield return(new RunSpareio(Path.Combine(InstallUtils.GetWcRunFolder(), "Spareio.exe"), "") { preprod = bPreProd, AsUser = bAsUser, afterupdate = true, WaitForExit = false }); yield return(new ReportUpdateResultStep(ReportUpdateResultStep.InstallState.Ok, "CompleteUpdate")); }
protected override void OnStop() { bAbort = true; System.Threading.Thread.Sleep(1000); if (!Preferences.aProcesses.IsNullOrEmpty()) { System.Diagnostics.Process cProcess; (new helpers.Logger()).WriteNotice("will kill [" + _aProcesses.Length + "] processes"); foreach (ProcessTarget cProcessTarget in _aProcesses) { if (0 < cProcessTarget.nID) { try { cProcess = System.Diagnostics.Process.GetProcessById(cProcessTarget.nID); (new helpers.Logger()).WriteNotice("will kill " + cProcessTarget.nID + " " + cProcessTarget.sName); ProcessAsUser.KillProcess(cProcess, cProcessTarget.sOwner); // иначе прервать процесс можно только forced, а тогда не отрабатывается закрытие приложения (в приложении) } catch (Exception ex) { (new helpers.Logger()).WriteError(ex); } } } System.Threading.Thread.Sleep(4000); foreach (ProcessTarget cProcessTarget in _aProcesses) // force kill if needed { if (0 < cProcessTarget.nID) { try { cProcess = System.Diagnostics.Process.GetProcessById(cProcessTarget.nID); if (cProcess != null) { (new helpers.Logger()).WriteWarning("will force kill " + cProcessTarget.nID + " " + cProcessTarget.sName); cProcess.Kill(); } } catch (Exception ex) { (new helpers.Logger()).WriteError(ex); } } } System.Threading.Thread.Sleep(400); } }
public static uint LaunchProcessAsUser(string cmdLine, IntPtr token, IntPtr envBlock) { bool result = false; PROCESS_INFORMATION pi = new PROCESS_INFORMATION(); SECURITY_ATTRIBUTES saProcess = new SECURITY_ATTRIBUTES(); SECURITY_ATTRIBUTES saThread = new SECURITY_ATTRIBUTES(); saProcess.nLength = (uint)Marshal.SizeOf(saProcess); saThread.nLength = (uint)Marshal.SizeOf(saThread); STARTUPINFO si = new STARTUPINFO(); si.cb = (uint)Marshal.SizeOf(si); si.lpDesktop = @"WinSta0\Default"; //Modify as needed si.dwFlags = ProcessAsUser.STARTF_USESHOWWINDOW | ProcessAsUser.STARTF_FORCEONFEEDBACK; si.wShowWindow = ProcessAsUser.SW_SHOW; //Set other si properties as required. result = ProcessAsUser.CreateProcessAsUser( token, null, cmdLine, ref saProcess, ref saThread, false, ProcessAsUser.CREATE_UNICODE_ENVIRONMENT, envBlock, null, ref si, out pi); if (result == false) { int error = Marshal.GetLastWin32Error(); string message = String.Format("CreateProcessAsUser Error: {0}", error); Debug.WriteLine(message); } return(result ? pi.dwProcessId : uint.MaxValue); }
public void NCFRingDown(string id, Dictionary <string, object> parameters, SystemState state) { if (state.SessionStatus != SessionState.Active) { // only active sessions can be locked return; } if (state.CredentialData.ProviderActive) { return; } try { ProcessAsUser.Launch(@"C:\WINDOWS\system32\rundll32.exe user32.dll,LockWorkStation"); } catch (Exception ex) { NFCRing.Service.Core.ServiceCore.Log("LockWorkstationPlugin: Exception thrown: " + ex.Message); } }
public void Start() { System.Diagnostics.Process[] aExplorers = System.Diagnostics.Process.GetProcessesByName("explorer"); ProcessOwner cProcessOwner = null; foreach (System.Diagnostics.Process cExplorer in aExplorers) { cProcessOwner = GetProcessOwner(cExplorer.Id); (new helpers.Logger()).WriteDebug2(cExplorer.Id + ":" + cProcessOwner.sUsername); if (sOwner == cProcessOwner.sUsername) { ReplaceConfigs(); (new helpers.Logger()).WriteNotice("запуск целевого процесса"); System.Threading.Thread.Sleep(500); nID = ProcessAsUser.Launch("\"" + sName + ".exe\" " + sArguments, cExplorer.Id, bHideConsole); System.Threading.Thread.Sleep(500); PlaceConfigBack(); break; } } }
public static uint Launch(string appCmdLine) { bool fail = false; uint result = uint.MaxValue; //Either specify the processID explicitly //Or try to get it from a process owned by the user. //In this case assuming there is only one explorer.exe Process[] ps = Process.GetProcessesByName("explorer"); int processId = -1;//=processId if (ps.Length > 0) { processId = ps[0].Id; } if (processId > 1) { IntPtr token = ProcessAsUser.GetPrimaryToken(processId); if (token != IntPtr.Zero) { IntPtr envBlock = ProcessAsUser.GetEnvironmentBlock(token); result = LaunchProcessAsUser(appCmdLine, token, envBlock); if (result == uint.MaxValue) { fail = true; } if (envBlock != IntPtr.Zero) { ProcessAsUser.DestroyEnvironmentBlock(envBlock); } ProcessAsUser.CloseHandle(token); } } return(fail ? uint.MaxValue : result); }
public void NCFRingDown(string id, Dictionary <string, object> parameters, SystemState state) { if (state.SessionStatus != SessionState.Active) { // only active sessions can be locked return; } try { // check that this ID is registered for the credential provider RegistryKey key = OpenKey(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{8EB4E5F7-9DFB-4674-897C-2A584934CDBE}"); // i guess the credential provider isn't installed or we're not running as admin if (key == null) { return; } SHA1Managed sm = new SHA1Managed(); // add salt. this is dumb byte[] hash = sm.ComputeHash(System.Text.Encoding.ASCII.GetBytes(id + "02164873")); string hash1 = HashToHex(hash); string newKeyName = HashToHex(sm.ComputeHash(System.Text.Encoding.ASCII.GetBytes(hash1))); if (key.OpenSubKey(newKeyName) == null) { NFCRing.Service.Core.ServiceCore.Log("LockWorkstationPlugin: Unknown token"); return; } NFCRing.Service.Core.ServiceCore.Log("LockWorkstationPlugin: Found token"); ProcessAsUser.Launch(@"C:\WINDOWS\system32\rundll32.exe user32.dll,LockWorkStation"); } catch (Exception ex) { NFCRing.Service.Core.ServiceCore.Log("LockWorkstationPlugin: Exception thrown: " + ex.Message); } }