Example #1
0
        private static ActionResult ExecuteScriptsFromXmlDataProperty(Session session, string XmlDataProperty, string installAction)
        {
            MessageResult iResult;

            using (var hActionRec = new Record(3))
            {
                hActionRec[1] = XmlDataProperty;
                hActionRec[2] = "Setup Scripts";
                hActionRec[3] = "[1] of [2], [3]";
                iResult       = session.Message(InstallMessage.ActionStart, hActionRec);
            }

            if (iResult == MessageResult.Cancel)
            {
                return(ActionResult.UserExit);
            }

            // Tell the installer to use explicit progress messages.
            using (var hProgressRec = new Record(3))
            {
                hProgressRec[1] = 1;
                hProgressRec[2] = 1;
                hProgressRec[3] = 0;
                iResult         = session.Message(InstallMessage.Progress, hProgressRec);
            }

            if (iResult == MessageResult.Cancel)
            {
                return(ActionResult.UserExit);
            }

            try
            {
                CustomActionData data = session.CustomActionData;

                foreach (var datum in data)
                {
                    string script = Encoding.Unicode.GetString(Convert.FromBase64String(datum.Value));
                    session.Log("Executing PowerShell script:\n{0}", script);

                    using (var task = new PowerShellTask(script, session))
                    {
                        var result = task.Execute();
                        session.Log("PowerShell non-terminating errors: {0}", !result);

                        if (!result)
                        {
                            session.Log("Returning Failure");

                            return(ActionResult.Failure);
                        }
                    }
                }

                return(ActionResult.Success);
            }
            catch (Exception ex)
            {
                session.Log("PowerShell terminating error, returning Failure");
                session.Log(ex.ToString());
                return(ActionResult.Failure);
            }
        }
Example #2
0
        private static ActionResult ExecuteScriptFilesFromXmlDataProperty(Session session, string XmlDataProperty, string installAction)
        {
            // Installer is executing the installation script. Set up a
            // record specifying appropriate templates and text for
            // messages that will inform the user about what the custom
            // action is doing. Tell the installer to use this template and
            // text in progress messages.
            MessageResult iResult;

            using (var hActionRec = new Record(3))
            {
                hActionRec[1] = XmlDataProperty;
                hActionRec[2] = "Setup Files";
                hActionRec[3] = "[1] of [2], [3]";
                iResult       = session.Message(InstallMessage.ActionStart, hActionRec);
            }

            if (iResult == MessageResult.Cancel)
            {
                return(ActionResult.UserExit);
            }

            // Tell the installer to use explicit progress messages.
            using (var hProgressRec = new Record(3))
            {
                hProgressRec[1] = 1;
                hProgressRec[2] = 1;
                hProgressRec[3] = 0;
                iResult         = session.Message(InstallMessage.Progress, hProgressRec);
            }

            if (iResult == MessageResult.Cancel)
            {
                return(ActionResult.UserExit);
            }

            try
            {
                if (!session.CustomActionData.ContainsKey("xml"))
                {
                    session.Log("Skipping as no CustomActionData key 'xml'");
                    return(ActionResult.NotExecuted);
                }

                string content = session.CustomActionData["xml"];

                XDocument doc = XDocument.Parse(content);

                foreach (XElement row in doc.Root.Elements("d"))
                {
                    string file = row.Attribute("file").Value;

                    string arguments    = row.Attribute("args").Value;
                    string IgnoreErrors = row.Attribute("IgnoreErrors").Value;
                    string action       = row.Attribute("InstallAction").Value;

                    //if (action == installAction)
                    //{
                    using (var task = new PowerShellTask(file, arguments, session))
                    {
                        try
                        {
                            bool result = task.Execute();
                            session.Log("PowerShell non-terminating errors: {0}", !result);
                            if (!result)
                            {
                                if (!IgnoreErrors.Equals("0"))
                                {
                                    session.Log("Ignoring failure due to 'IgnoreErrors' marking");
                                }
                                else
                                {
                                    session.Log("Returning Failure");
                                    return(ActionResult.Failure);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            if (!IgnoreErrors.Equals("0"))
                            {
                                session.Log("Ignoring PowerShell error due to 'IgnoreErrors' marking");
                                session.Log(ex.ToString());
                            }
                            else
                            {
                                session.Log("PowerShell terminating error, returning Failure");
                                session.Log(ex.ToString());
                                return(ActionResult.Failure);
                            }
                        }
                    }
                }
                //}

                return(ActionResult.Success);
            }
            catch (Exception ex)
            {
                session.Log("PowerShell terminating error, returning Failure");
                session.Log(ex.ToString());
                return(ActionResult.Failure);
            }
        }
        private static ActionResult ScriptsDeferred(Session session, string deferredProperty)
        {
            MessageResult iResult;

            using (var hActionRec = new Record(3))
            {
                hActionRec[1] = deferredProperty;
                hActionRec[2] = "PowerShell Scripts";
                hActionRec[3] = "[1] of [2], [3]";
                iResult       = session.Message(InstallMessage.ActionStart, hActionRec);
            }

            if (iResult == MessageResult.Cancel)
            {
                return(ActionResult.UserExit);
            }

            // Tell the installer to use explicit progress messages.
            using (var hProgressRec = new Record(3))
            {
                hProgressRec[1] = 1;
                hProgressRec[2] = 1;
                hProgressRec[3] = 0;
                iResult         = session.Message(InstallMessage.Progress, hProgressRec);
            }

            if (iResult == MessageResult.Cancel)
            {
                return(ActionResult.UserExit);
            }

            try
            {
                List <ScriptActionData> scripts = new List <ScriptActionData>();
                string        cad  = session["CustomActionData"];
                XmlSerializer srlz = new XmlSerializer(scripts.GetType());
                if (string.IsNullOrWhiteSpace(cad))
                {
                    session.Log("Nothing to do");
                    return(ActionResult.Success);
                }

                using (StringReader sr = new StringReader(cad))
                {
                    IEnumerable <ScriptActionData> tempScripts = srlz.Deserialize(sr) as IEnumerable <ScriptActionData>;
                    if (tempScripts != null)
                    {
                        scripts.AddRange(tempScripts);
                    }
                }

                foreach (ScriptActionData datum in scripts)
                {
                    string script = Encoding.Unicode.GetString(Convert.FromBase64String(datum.Script));
                    session.Log($"Executing PowerShell script {datum.Id}:\n{script}");

                    using (var task = new PowerShellTask(script, session))
                    {
                        bool result = false;
                        try
                        {
                            result = task.Execute();
                            session.Log("PowerShell terminating errors: {0}", result);
                        }
                        catch (Exception ex)
                        {
                            result = false;
                            session.Log(ex.ToString());
                        }
                        if (!result)
                        {
                            if (datum.IgnoreErrors)
                            {
                                session.Log("Script execution failed. Ignoring error");
                                continue;
                            }

                            session.Log("Returning Failure");
                            return(ActionResult.Failure);
                        }
                    }
                }

                return(ActionResult.Success);
            }
            catch (Exception ex)
            {
                session.Log("PowerShell terminating error, returning Failure");
                session.Log(ex.ToString());
                return(ActionResult.Failure);
            }
        }