// 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);
        }
Ejemplo n.º 2
0
        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
                };
            }
        }
Ejemplo n.º 3
0
        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"));
        }
Ejemplo n.º 4
0
 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);
     }
 }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
 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);
     }
 }
Ejemplo n.º 7
0
            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;
                    }
                }
            }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
            }
        }