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); } } }
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; }
/// <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; }
/// <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; }
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; }