コード例 #1
0
        private void UninstallOperation(RvSofOperation operation)
        {
            var registry         = new RegistryReader();
            var tempAppsToAdd    = new List <RVsofResult.AppsToAdd2>();
            var tempAppsToDelete = new List <RVsofResult.AppsToDelete2>();
            var savedOperations  = Operations.LoadOpDirectory().Where(p => p.operation == OperationValue.Uninstall).ToList();

            if (!savedOperations.Any())
            {
                Logger.Log("There are no operations remaining, Unable to uninstall app: {0}", LogLevel.Warning, operation.Type);
                return;
            }

            foreach (var localOp in savedOperations)
            {
                if (operation.ListOfInstalledApps.Any())
                {
                    operation.ListOfInstalledApps.Clear();
                }
                if (operation.ListOfAppsAfterInstall.Any())
                {
                    operation.ListOfAppsAfterInstall.Clear();
                }

                //Retrieve a list of all updates installed in the system before uninstalling anything.
                operation.ListOfInstalledApps = registry.GetRegistryInstalledApplicationNames();
                Operations.UpdateStatus(localOp, Operations.OperationStatus.Processing);

                var msiUninstall = new MSIUninstaller.MSIprop();
                try
                {
                    if (localOp.filedata_app_name != String.Empty)
                    {
                        msiUninstall = MSIUninstaller.UnistallApp(localOp.filedata_app_name);
                    }
                }
                catch
                {
                    Logger.Log("MSIuninstaller crashed while attempting to uninstall {0}", LogLevel.Error, localOp.filedata_app_name);
                    msiUninstall.UninstallPass = false;
                }

                Application update = null;
                if (!msiUninstall.UninstallPass)
                {
                    var installedUpdates = WindowsUpdates.GetInstalledUpdates();
                    update = (from n in installedUpdates where n.Name == localOp.filedata_app_name select n).FirstOrDefault();
                }

                var uninstallerResults = new UninstallerResults();
                if (!msiUninstall.UninstallPass)
                {
                    try
                    {
                        uninstallerResults = WindowsUninstaller.Uninstall(update);
                    }
                    catch
                    {
                        Logger.Log("Windows Uninstall Update failed.", LogLevel.Error);
                        uninstallerResults.Success = false;
                    }
                }

                //Get all installed application after installing..
                operation.ListOfAppsAfterInstall = registry.GetRegistryInstalledApplicationNames();

                //GET DATA FOR APPSTOADD/APPSTODELETE
                var appListToDelete = RegistryReader.GetAppsToDelete(operation.ListOfInstalledApps, operation.ListOfAppsAfterInstall);
                var appListToAdd    = RegistryReader.GetAppsToAdd(operation.ListOfInstalledApps, operation.ListOfAppsAfterInstall);

                //APPS TO DELETE
                #region Apps to Delete
                if (appListToDelete != null)
                {
                    var temp = registry.GetAllInstalledApplicationDetails();
                    foreach (var app in appListToDelete)
                    {
                        var appsToDelete = new RVsofResult.AppsToDelete2();
                        var version      = (from d in temp where d.Name == localOp.filedata_app_name select d.Version).FirstOrDefault();

                        appsToDelete.Name    = (String.IsNullOrEmpty(app)) ? String.Empty : app;
                        appsToDelete.Version = (String.IsNullOrEmpty(version)) ? String.Empty : version;

                        tempAppsToDelete.Add(appsToDelete);
                    }
                }
                #endregion

                //APPS TO ADD
                #region Apps to Add
                if (appListToAdd != null)
                {
                    var installedAppsDetails = registry.GetAllInstalledApplicationDetails();

                    foreach (var app in appListToAdd)
                    {
                        var temp        = new RVsofResult.AppsToAdd2();
                        var localApp    = app;
                        var version     = (from d in installedAppsDetails where d.Name == localOp.filedata_app_name select d.Version).FirstOrDefault();       //Default NULL
                        var vendor      = (from d in installedAppsDetails where d.Name == localApp select d.VendorName).FirstOrDefault();                     //Default NULL
                        var installDate = Tools.ConvertDateToEpoch((from d in installedAppsDetails where d.Name == localApp select d.Date).FirstOrDefault()); //Default 0.0D

                        temp.AppsToAdd.Name           = (String.IsNullOrEmpty(localApp)) ? String.Empty : localApp;
                        temp.AppsToAdd.Version        = (String.IsNullOrEmpty(version)) ? String.Empty : version;
                        temp.AppsToAdd.InstallDate    = (installDate.Equals(0.0D)) ? 0.0D : installDate;
                        temp.AppsToAdd.VendorName     = (String.IsNullOrEmpty(vendor)) ? String.Empty : vendor;
                        temp.AppsToAdd.RebootRequired = "no";
                        temp.AppsToAdd.ReleaseDate    = 0.0;
                        temp.AppsToAdd.Status         = "installed";
                        temp.AppsToAdd.Description    = String.Empty;
                        temp.AppsToAdd.SupportUrl     = String.Empty;
                        temp.AppsToAdd.VendorId       = String.Empty;
                        temp.AppsToAdd.VendorSeverity = String.Empty;
                        temp.AppsToAdd.KB             = String.Empty;

                        tempAppsToAdd.Add(temp);
                    }
                }
                #endregion


                if (uninstallerResults.Success || msiUninstall.UninstallPass)
                {
                    // Success! Uinstalled OK
                    localOp.success         = true.ToString().ToLower();
                    localOp.reboot_required = String.IsNullOrEmpty(uninstallerResults.Restart.ToString()) ? "no" : uninstallerResults.Restart.ToString();
                    localOp.error           = string.Empty;

                    operation.Api  = ApiCalls.RvUninstallOperation();
                    operation.Type = OperationValue.Uninstall;
                    operation.Id   = localOp.operation_id;

                    InstallSendResults(localOp, operation, tempAppsToAdd, tempAppsToDelete);
                }
                else
                {
                    // Fail! Uinstalled Failed.
                    localOp.success         = false.ToString().ToLower();
                    localOp.reboot_required = String.IsNullOrEmpty(uninstallerResults.Restart.ToString()) ? "no" : uninstallerResults.Restart.ToString();
                    localOp.error           = "Unable to successfully uninstall application. If this is not a Windows Update Uninstall, ensure that the application is of type MSI We currently do not support other installers. Error: " + msiUninstall.Error;

                    operation.Api  = ApiCalls.RvUninstallOperation();
                    operation.Type = OperationValue.Uninstall;
                    operation.Id   = localOp.operation_id;

                    InstallSendResults(localOp, operation, tempAppsToAdd, tempAppsToDelete);
                }
            }
        }
コード例 #2
0
            public UninstallerResults Uninstall(Update update)
            {
                UninstallerResults results = new UninstallerResults();
                if ((winVersion == NTVersion.XP) || (winVersion == NTVersion.Server2003))
                {
                    results = WinNT51_52Procedure(update);
                }
                else if ((winVersion == NTVersion.VistaServer2008))
                {
                    results = WinNT60Procedure(update);
                }
                else if (winVersion == NTVersion.SevenServer2008R2)
                {
                    results = WinNT61Procedure(update);
                }

                return results;
            }
コード例 #3
0
            /// <summary>
            /// Here begins the procedure to uninstall updates on Windows Vista & Windows Server 2008.
            /// </summary>
            /// <param name="update">Update to uninstall.</param>
            private UninstallerResults WinNT60Procedure(Update update)
            {
                UninstallerResults results = new UninstallerResults();
                AgentSettings.Log("In WinNT60Procedure.");

                string cabFilePath = FindCabFile(update.KB);
                if (cabFilePath == null)
                {
                    results = ProcessUninstallerResults(WindowsExitCode.UpdateNotFound);
                    return results;
                }

                // Arguments used by "pkgmgr.exe"
                string noGUI = "/quiet";
                string noRestart = "/norestart";
                // /up is the uninstall command. /s is a temp sandbox directory where to unpack the CAB file.
                string arguments = String.Format(@"/m:{0} /up /s:{1} {2} {3}", cabFilePath, Path.Combine(System.IO.Path.GetTempPath(), update.KB), noGUI, noRestart);

                WindowsExitCode exitCode = WindowsProcess("pkgmgr.exe", arguments);
                results = ProcessUninstallerResults(exitCode);

                return results;
            }
コード例 #4
0
            /// <summary>
            /// Here begins the procedure to uninstall updates on Windows 7 & Windows Server 2008 R2. (6.1)
            /// </summary>
            /// <param name="update">Update to uninstall.</param>
            private UninstallerResults WinNT61Procedure(Update update)
            {
                // TODO: NOT FULLY BAKED!!!! Doesn't check registry for updates that could be there.

                List<QfeData> qfeList = QueryWMIHotfixes();
                UninstallerResults temp = new UninstallerResults();

                foreach (QfeData qfe in qfeList)
                {
                    if (qfe.HotFixID.Equals(update.KB))
                    {
                        return WusaProcess(update.KB);
                    }
                }
                return temp;
            }
コード例 #5
0
            private UninstallerResults ProcessUninstallerResults(WindowsExitCode exitCode)
            {
                UninstallerResults results = new UninstallerResults();

                switch (exitCode)
                {
                    ///////////////////// The Good Codes(TM) ///////////////////////////
                    case WindowsExitCode.Sucessful:
                        results.Sucess = true;
                        results.Restart = false;
                        results.Message = "Update was successfully uninstalled.";
                        results.ExitCode = WindowsExitCode.Sucessful;
                        break;

                    case WindowsExitCode.Reboot:
                    case WindowsExitCode.Restart:
                        results.Sucess = true;
                        results.Restart = true;
                        results.Message = "Update was successfully uninstalled, but the system needs to be rebooted.";
                        results.ExitCode = WindowsExitCode.Reboot;
                        break;
                    ///////////////////////////////////////////////////////////////////

                    case WindowsExitCode.NotAllowed:
                        results.Sucess = false;
                        results.Restart = false;
                        results.Message = "Update is required by Windows so it can't be uninstalled.";
                        results.ExitCode = WindowsExitCode.NotAllowed;
                        break;

                    case WindowsExitCode.UpdateNotFound:
                        results.Sucess = false;
                        results.Restart = false;
                        results.Message = "Update (or installer package) could not be found.";
                        results.ExitCode = WindowsExitCode.UpdateNotFound;
                        break;

                    case WindowsExitCode.Failed:
                        results.Sucess = false;
                        results.Restart = false;
                        results.Message = "Update could not be uninstalled.";
                        results.ExitCode = WindowsExitCode.Failed;
                        break;

                    case WindowsExitCode.Catastrophic:
                        results.Sucess = false;
                        results.Restart = false;
                        results.Message = "A catastrophic error accured at the system level.";
                        results.ExitCode = WindowsExitCode.Catastrophic;
                        break;

                    default:
                        results.Sucess = false;
                        results.Restart = false;
                        results.Message = "Win32 Error: " + new Win32Exception((int)exitCode).Message;
                        results.ExitCode = exitCode;
                        break;
                }
                return results;
            }