Beispiel #1
0
        private void InstallMsu(DtoClientFileHash file)
        {
            var directory = Path.Combine(DtoGobalSettings.BaseCachePath, _module.Guid) + Path.DirectorySeparatorChar;
            var pArgs     = new DtoProcessArgs();

            pArgs.RunWith          = "wusa.exe";
            pArgs.Command          = "\"" + directory + file.FileName + "\"";
            pArgs.Arguments        = "/quiet /norestart " + _module.Arguments;
            pArgs.Timeout          = _module.Timeout;
            pArgs.WorkingDirectory = directory;
            pArgs.RedirectError    = _module.RedirectError;
            pArgs.RedirectOutput   = _module.RedirectOutput;

            var result = new ServiceProcess(pArgs).RunProcess();

            Logger.Info(JsonConvert.SerializeObject(result));
            Logger.Info("Windows Update Module: " + _module.DisplayName + "Finished");

            _moduleResult.ExitCode = result.ExitCode.ToString();
            if (!_module.SuccessCodes.Contains(result.ExitCode.ToString()))
            {
                _moduleResult.Success      = false;
                _moduleResult.ErrorMessage = result.StandardError;
            }
        }
Beispiel #2
0
 public ServiceProcess(DtoProcessArgs processArgs)
 {
     _processArgs = processArgs;
     _output      = new StringBuilder();
     _error       = new StringBuilder();
 }
Beispiel #3
0
        public DtoModuleResult Run()
        {
            var printerFound = false;

            Logger.Info("Running Printer Module: " + _module.DisplayName);
            var pArgs = new DtoProcessArgs();

            if (_module.PrinterAction == EnumPrinterModule.ActionType.InstallPowershell)
            {
                pArgs.RunWith = "Powershell.exe";
            }
            else
            {
                pArgs.RunWith = "rundll32.exe";
            }

            var printerArgs = GetPrinterArgs(isSecondPass: false);

            if (printerArgs == null)
            {
                _moduleResult.Success      = false;
                _moduleResult.ExitCode     = "-1";
                _moduleResult.ErrorMessage = "Could Not Determine Printer Action Type";
                return(_moduleResult);
            }

            if (_module.PrinterAction == EnumPrinterModule.ActionType.InstallPowershell)
            {
                pArgs.Command = "Add-Printer " + printerArgs;
            }
            else
            {
                pArgs.Command = "printui.dll,PrintUIEntry " + printerArgs;
            }

            pArgs.Timeout = 1;
            var result = new ServiceProcess(pArgs).RunProcess();

            _moduleResult.ExitCode = result.ExitCode.ToString();

            if (result.ExitCode != 0 || !string.IsNullOrEmpty(result.StandardError))
            {
                _moduleResult.Success      = false;
                _moduleResult.ErrorMessage = result.StandardError;
                Logger.Info("Printer Module: " + _module.DisplayName + "Finished");
                return(_moduleResult);
            }


            if (_module.WaitForEnumeration)
            {
                Logger.Debug("Enumerating Printers");
                int count = 0;
                while (true)
                {
                    var tempFound = PrinterFound();
                    if (tempFound && (_module.PrinterAction == EnumPrinterModule.ActionType.Install || _module.PrinterAction == EnumPrinterModule.ActionType.InstallPowershell))
                    {
                        Logger.Debug("Found Printer.");
                        printerFound = true;
                        break;
                    }
                    else if (tempFound && _module.PrinterAction == EnumPrinterModule.ActionType.Delete)
                    {
                        Logger.Debug("Printer Still Exists.");
                        printerFound = true;
                    }
                    else if (!tempFound && (_module.PrinterAction == EnumPrinterModule.ActionType.Install || _module.PrinterAction == EnumPrinterModule.ActionType.InstallPowershell))
                    {
                        Logger.Debug("Could Not Find Printer.");
                        printerFound = false;
                    }
                    else if (!tempFound && _module.PrinterAction == EnumPrinterModule.ActionType.Delete)
                    {
                        Logger.Debug("Could Not Find Printer.");
                        printerFound = false;
                        break;
                    }

                    if (count == 24 && (_module.PrinterAction == EnumPrinterModule.ActionType.Install || _module.PrinterAction == EnumPrinterModule.ActionType.InstallPowershell))
                    {
                        Logger.Debug("Could Not Verify Printer Was Installed.  Giving Up.");
                        break;
                    }
                    else if (count == 24 && _module.PrinterAction == EnumPrinterModule.ActionType.Delete)
                    {
                        Logger.Debug("Could Not Verify Printer Was Deleted.  Giving Up.");
                        break;
                    }

                    Logger.Debug("Waiting...");
                    Task.Delay(5 * 1000).Wait();
                    count++;
                }
            }
            else
            {
                //if enumeration skipped, must assume printer found
                printerFound = true;
            }

            if (printerFound && _module.IsDefault && _module.PrinterAction != EnumPrinterModule.ActionType.None)
            {
                Logger.Info("Setting Printer As Default.");
                pArgs         = new DtoProcessArgs();
                pArgs.RunWith = "rundll32.exe";
                printerArgs   = GetPrinterArgs(isSecondPass: true);
                if (printerArgs == null)
                {
                    _moduleResult.Success      = false;
                    _moduleResult.ExitCode     = "-1";
                    _moduleResult.ErrorMessage = "Could Not Determine Printer Action Type";
                    return(_moduleResult);
                }
                pArgs.Command          = "printui.dll,PrintUIEntry " + printerArgs;
                pArgs.Timeout          = 1;
                result                 = new ServiceProcess(pArgs).RunProcess();
                _moduleResult.ExitCode = result.ExitCode.ToString();

                if (result.ExitCode != 0 || !string.IsNullOrEmpty(result.StandardError))
                {
                    _moduleResult.Success      = false;
                    _moduleResult.ErrorMessage = result.StandardError;
                    Logger.Info("Printer Module: " + _module.DisplayName + "Finished");
                    return(_moduleResult);
                }
            }


            if ((_module.PrinterAction == EnumPrinterModule.ActionType.Install || _module.PrinterAction == EnumPrinterModule.ActionType.InstallPowershell) && !printerFound)
            {
                _moduleResult.Success      = false;
                _moduleResult.ExitCode     = "-1";
                _moduleResult.ErrorMessage = "Unknown Error";
                Logger.Error("Printer Installation Failed.");
            }
            else if (_module.PrinterAction == EnumPrinterModule.ActionType.Delete && printerFound)
            {
                _moduleResult.Success      = false;
                _moduleResult.ExitCode     = "-1";
                _moduleResult.ErrorMessage = "Unknown Error";
                Logger.Error("Printer Removal Failed.");
            }

            if (_module.RestartSpooler)
            {
                Logger.Info("Restarting Print Spooler");
                var restartResult = _trigger == EnumPolicy.Trigger.Login
                    ? new APICall().LocalApi.RestartPrintSpooler()
                    : new ServiceSystemService().RestartPrintSpooler();
                if (restartResult)
                {
                    Logger.Info("Print Spooler Restarted Successfully");
                }
                else
                {
                    Logger.Error("Print Spooler Failed To Restart.");
                }
            }

            return(_moduleResult);
        }
Beispiel #4
0
        public DtoModuleResult Run()
        {
            Logger.Info("Running Script Module: " + _module.DisplayName);

            string runWith     = "";
            string runWithArgs = "";
            string ext;

            if (_module.ScriptType == EnumScriptModule.ScriptType.Powershell)
            {
                runWith     = "Powershell.exe";
                runWithArgs = " -ExecutionPolicy Bypass -NoProfile -File ";
                ext         = ".ps1";
            }
            else if (_module.ScriptType == EnumScriptModule.ScriptType.VbScript)
            {
                runWith = "cscript.exe";
                ext     = ".vbs";
            }
            else if (_module.ScriptType == EnumScriptModule.ScriptType.Batch)
            {
                runWith     = "cmd.exe";
                runWithArgs = " /c ";
                ext         = ".bat";
            }
            else
            {
                var msg = "Could Not Determine Script Type.  Exiting.";
                Logger.Error(msg);
                _moduleResult.Success      = false;
                _moduleResult.ExitCode     = "1";
                _moduleResult.ErrorMessage = msg;
                return(_moduleResult);
            }

            if (!string.IsNullOrEmpty(_module.RunAs))
            {
                var iTask = new ServiceImpersonationTask();
                iTask.Command   = runWith;
                iTask.Arguments = runWithArgs + "\"" + Path.Combine(DtoGobalSettings.BaseCachePath, _module.Guid, _module.Guid + ext) +
                                  "\"" + " " + _module.Arguments;
                iTask.ExecutionTimeout = _module.Timeout;
                iTask.ModuleGuid       = _module.Guid;
                if (!string.IsNullOrEmpty(_module.WorkingDirectory))
                {
                    iTask.WorkingDirectory = _module.WorkingDirectory;
                }
                else
                {
                    iTask.WorkingDirectory = Path.Combine(DtoGobalSettings.BaseCachePath, _module.Guid);
                }
                iTask.ImpersonationGuid = _module.RunAs;
                var result = iTask.RunTask();
                Logger.Info(JsonConvert.SerializeObject(result));
                Logger.Info("Script Module: " + _module.DisplayName + " Finished");
                _moduleResult.ExitCode = result.ToString();
                if (!_module.SuccessCodes.Contains(result.ToString()))
                {
                    _moduleResult.Success = false;
                    if (result == 259)
                    {
                        _moduleResult.ErrorMessage = "Task Timed Out.";
                    }
                    else
                    {
                        _moduleResult.ErrorMessage = "Impersonation Task Failed.  See Log For Details.";
                    }
                }
            }
            else
            {
                var pArgs = new DtoProcessArgs();
                pArgs.RunWith     = runWith;
                pArgs.RunWithArgs = runWithArgs;
                pArgs.Command     = "\"" + Path.Combine(DtoGobalSettings.BaseCachePath, _module.Guid, _module.Guid + ext) +
                                    "\"";
                pArgs.Arguments      = _module.Arguments;
                pArgs.Timeout        = _module.Timeout;
                pArgs.RedirectError  = _module.RedirectError;
                pArgs.RedirectOutput = _module.RedirectOutput;
                if (!string.IsNullOrEmpty(_module.WorkingDirectory))
                {
                    pArgs.WorkingDirectory = _module.WorkingDirectory;
                }
                else
                {
                    pArgs.WorkingDirectory = Path.Combine(DtoGobalSettings.BaseCachePath, _module.Guid);
                }
                if (_module.AddToInventory)
                {
                    pArgs.RedirectOutput = true;
                }
                var result = new ServiceProcess(pArgs).RunProcess();
                Logger.Info(JsonConvert.SerializeObject(result));

                if (_module.AddToInventory)
                {
                    var resultLine = GetLastStdOutLine(result.StandardOut);
                    if (!string.IsNullOrEmpty(resultLine))
                    {
                        _moduleResult.ScriptOutput            = new DtoScriptModuleOutput();
                        _moduleResult.ScriptOutput.ModuleGuid = _module.Guid;
                        _moduleResult.ScriptOutput.Value      = resultLine;
                    }
                }

                Logger.Info("Script Module: " + _module.DisplayName + " Finished");

                _moduleResult.ExitCode = result.ExitCode.ToString();
                if (!_module.SuccessCodes.Contains(result.ExitCode.ToString()))
                {
                    _moduleResult.Success      = false;
                    _moduleResult.ErrorMessage = result.StandardError;
                }
            }

            return(_moduleResult);
        }
Beispiel #5
0
        public DtoModuleResult Run()
        {
            Logger.Info("Running Command Module: " + _module.DisplayName);
            if (!string.IsNullOrEmpty(_module.RunAs))
            {
                var iTask = new ServiceImpersonationTask();
                iTask.Command = "cmd.exe";
                if (_module.Command.StartsWith("[unquote]"))
                {
                    _module.Command = _module.Command.Replace("[unquote]", "");
                    iTask.Arguments = "/c " + _module.Command + " " + _module.Arguments;
                }
                else
                {
                    iTask.Arguments = "/c " + "\"" + _module.Command + "\"" + " " + _module.Arguments;
                }
                iTask.ExecutionTimeout = _module.Timeout;
                iTask.ModuleGuid       = _module.Guid;
                if (!string.IsNullOrEmpty(_module.WorkingDirectory))
                {
                    iTask.WorkingDirectory = _module.WorkingDirectory;
                }
                else
                {
                    iTask.WorkingDirectory = Path.Combine(DtoGobalSettings.BaseCachePath, _module.Guid);
                }
                iTask.ImpersonationGuid = _module.RunAs;
                var result = iTask.RunTask();
                Logger.Info(JsonConvert.SerializeObject(result));
                Logger.Info("Command Module: " + _module.DisplayName + " Finished");
                _moduleResult.ExitCode = result.ToString();
                if (!_module.SuccessCodes.Contains(result.ToString()))
                {
                    _moduleResult.Success = false;
                    if (result == 259)
                    {
                        _moduleResult.ErrorMessage = "Task Timed Out.";
                    }
                    else
                    {
                        _moduleResult.ErrorMessage = "Impersonation Task Failed.  See Log For Details.";
                    }
                }
            }
            else
            {
                var pArgs = new DtoProcessArgs();
                pArgs.RunWith     = "cmd.exe";
                pArgs.RunWithArgs = "/c ";
                if (_module.Command.StartsWith("[unquote]"))
                {
                    _module.Command = _module.Command.Replace("[unquote]", "");
                    pArgs.Command   = _module.Command;
                }
                else
                {
                    pArgs.Command = "\"" + _module.Command + "\"";
                }
                pArgs.Arguments      = _module.Arguments;
                pArgs.Timeout        = _module.Timeout;
                pArgs.RedirectError  = _module.RedirectError;
                pArgs.RedirectOutput = _module.RedirectOutput;
                if (!string.IsNullOrEmpty(_module.WorkingDirectory))
                {
                    pArgs.WorkingDirectory = _module.WorkingDirectory;
                }
                else
                {
                    pArgs.WorkingDirectory = Path.Combine(DtoGobalSettings.BaseCachePath, _module.Guid);
                }

                var result = new ServiceProcess(pArgs).RunProcess();
                Logger.Info(JsonConvert.SerializeObject(result));
                Logger.Info("Command Module: " + _module.DisplayName + " Finished");
                _moduleResult.ExitCode = result.ExitCode.ToString();
                if (!_module.SuccessCodes.Contains(result.ExitCode.ToString()))
                {
                    _moduleResult.Success      = false;
                    _moduleResult.ErrorMessage = result.StandardError;
                }
            }

            return(_moduleResult);
        }
Beispiel #6
0
        private bool UpdateClient(string msiFile)
        {
            Logger.Info("Updating Toec To: " + msiFile);


            try
            {
                Directory.CreateDirectory(DtoGobalSettings.BaseCachePath + "ClientUpgrades\\");
            }
            catch
            {
                //ignored
            }

            Logger.Debug($"Obtaining A Download Connection To {DtoGobalSettings.ComServer}");
            var downloadConRequest = new DtoDownloadConRequest();

            downloadConRequest.ComputerGuid = DtoGobalSettings.ClientIdentity.Guid;
            downloadConRequest.ComputerName = DtoGobalSettings.ClientIdentity.Name;
            downloadConRequest.ComServer    = DtoGobalSettings.ComServer;
            var downloadConnection = new APICall().PolicyApi.CreateDownloadConnection(downloadConRequest);

            if (downloadConnection == null)
            {
                Logger.Error("Could Not Obtain Download Connection. Response was null.");
                return(false);
            }

            if (!downloadConnection.Success)
            {
                Logger.Error("Could Not Obtain Download Connection. " + downloadConnection.ErrorMessage);
                return(false);
            }

            if (downloadConnection.QueueIsFull)
            {
                Logger.Debug("Download Connections Are Full");
                return(false);
            }

            Logger.Debug("Downloading Files");

            var msiRequest = new DtoClientFileRequest();

            msiRequest.FileName = msiFile;
            Logger.Debug($"Downloading {msiRequest.FileName}");
            if (!new APICall().PolicyApi.GetClientUpgrade(msiRequest, DtoGobalSettings.ClientIdentity.Name))
            {
                Logger.Debug("Releasing The Download Connection.");
                new APICall().PolicyApi.RemoveDownloadConnection(downloadConRequest);
                return(false);
            }

            Logger.Debug("Releasing The Download Connection.");
            new APICall().PolicyApi.RemoveDownloadConnection(downloadConRequest);

            if (new FileInfo(DtoGobalSettings.BaseCachePath + "ClientUpgrades\\" + msiFile).Length < 1)
            {
                Logger.Debug("MSI File was invalid.");
                return(false);
            }

            var pArgs = new DtoProcessArgs();

            pArgs.RunWith          = "msiexec.exe";
            pArgs.RunWithArgs      = " /i ";
            pArgs.Command          = "\"" + DtoGobalSettings.BaseCachePath + "ClientUpgrades\\" + msiFile + "\"" + $" /q /norestart";
            pArgs.Timeout          = 5;
            pArgs.WorkingDirectory = DtoGobalSettings.BaseCachePath + "ClientUpgrades\\";
            var result = new ServiceProcess(pArgs).RunProcess();

            //Nothing from here on should execute. Updating msi should kill this process.
            Logger.Info(JsonConvert.SerializeObject(result));
            return(true);
        }
Beispiel #7
0
        public DtoModuleResult Run()
        {
            var directory = Path.Combine(DtoGobalSettings.BaseCachePath, _module.Guid) + Path.DirectorySeparatorChar;

            Logger.Info("Running Software Module: " + _module.DisplayName);

            string runWith     = "msiexec.exe";
            string runWithArgs = "";

            switch (_module.InstallType)
            {
            case EnumSoftwareModule.MsiInstallType.Install:
                runWithArgs = " /i ";
                break;

            case EnumSoftwareModule.MsiInstallType.Uninstall:
                runWithArgs = " /x ";
                break;

            case EnumSoftwareModule.MsiInstallType.Patch:
                runWithArgs = " /p ";
                break;
            }

            if (!string.IsNullOrEmpty(_module.RunAs))
            {
                var iTask = new ServiceImpersonationTask();
                iTask.Command           = runWith;
                iTask.Arguments         = runWithArgs + "\"" + directory + _module.Command + "\"" + " " + _module.Arguments;
                iTask.ExecutionTimeout  = _module.Timeout;
                iTask.ModuleGuid        = _module.Guid;
                iTask.ImpersonationGuid = _module.RunAs;

                var result = iTask.RunTask();
                Logger.Info(JsonConvert.SerializeObject(result));
                Logger.Info("Software Module: " + _module.DisplayName + " Finished");
                _moduleResult.ExitCode = result.ToString();
                if (!_module.SuccessCodes.Contains(result.ToString()))
                {
                    _moduleResult.Success = false;
                    if (result == 259)
                    {
                        _moduleResult.ErrorMessage = "Task Timed Out.";
                    }
                    else
                    {
                        _moduleResult.ErrorMessage = "Impersonation Task Failed.  See Log For Details.";
                    }
                }
            }
            else
            {
                var pArgs = new DtoProcessArgs();
                pArgs.RunWith          = runWith;
                pArgs.RunWithArgs      = runWithArgs;
                pArgs.Command          = "\"" + directory + _module.Command + "\"";
                pArgs.Arguments        = _module.Arguments;
                pArgs.Timeout          = _module.Timeout;
                pArgs.WorkingDirectory = directory;
                pArgs.RedirectError    = _module.RedirectError;
                pArgs.RedirectOutput   = _module.RedirectOutput;

                var result = new ServiceProcess(pArgs).RunProcess();
                Logger.Info(JsonConvert.SerializeObject(result));
                Logger.Info("Software Module: " + _module.DisplayName + "Finished");

                _moduleResult.ExitCode = result.ExitCode.ToString();
                if (!_module.SuccessCodes.Contains(result.ExitCode.ToString()))
                {
                    _moduleResult.Success      = false;
                    _moduleResult.ErrorMessage = result.StandardError;
                }
            }

            return(_moduleResult);
        }