From 05703ac62ddb98c3a88802205c9d5a97765d7651 Mon Sep 17 00:00:00 2001 From: Toby Hu Date: Tue, 12 Apr 2016 11:42:54 -0700 Subject: [PATCH] fix readme and add eula --- ReadMe.md | 34 ++++++++++++---------- TotalUninstaller EULA.docx | Bin 0 -> 42202 bytes src/Uninstall_Wrapper/Program.cs | 14 ++++----- src/VS.ConfigurationManager/Package.cs | 15 ++-------- src/VS.ConfigurationManager/Primitives.cs | 22 +++++++------- 5 files changed, 38 insertions(+), 47 deletions(-) create mode 100644 TotalUninstaller EULA.docx diff --git a/ReadMe.md b/ReadMe.md index 9b9cce0..e1b51cc 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,7 +1,14 @@ -Visual Studio Uninstaller +Visual Studio Uninstaller ========= -Visual Studio Uninstallation sometimes can be unreliable and often leave out a lot of unwanted artifacts. Visual Studio Uninstaller is designed to thoroughly and reliably remove these unwanted artifacts. +This executable is designed to cleanup/scorch all Preview/RC/RTM releases of Visual Studio 2013, Visual Studio 2015 and Visual Studio vNext. It should be used as the last resort to clean up the user's system before resorting to reimaging the machine. + +Running this application will break Visual Studio 2012 and earlier versions of Visual Studio because Visual Studio 2012 have some MSIs that have the same upgrade codes as Visual Studio 2013 and above. + +How it works? +======== + +This app finds and uninstall every Preview/RC/RTM releases of Visual Studio 2013/2015/vNext. It will first execute uninstall command on the bundle, and then it will uninstall any stale MSIs. The application contains a master list of Bundle IDs and upgrade codes for every MSI ever chained in by Visual Studio 2013-vNext. It will not uninstall MSU or MSIs that marked as ReallyPermanent. Status ======== @@ -24,12 +31,7 @@ Usage **How to debug Total Uninstaller remotely?** -Uncommenting the following lines will not execute the actual uninstall. A debug flag will be added in the future. - - //uti.bDebug = op.Debug; ip.DebugReporting = op.Debug; - //ip.DoNotExecuteProcess = true; - -Note: Do not run this on your development machine without setting the `DoNotExecuteProcess` flag. This will prevent the application from uninstalling the very development environment you are working from. +IMPORTANT: Do not run this on your development machine without setting the `DoNotExecuteProcess` flag. This will prevent the application from uninstalling the very development environment you are working from. To get the most out of the debug experience, I recommend the following: @@ -44,14 +46,16 @@ To get the most out of the debug experience, I recommend the following: **Using Total Uninstall:** - 1. The user identifies which SKU of which release he wants to uninstall. - 2. The user downloads one or more data files (from `DataFiles` folder) to a local folder. - 3. The user executes Total Uninstaller and then `dir` to the directory containing the config files. - 4. The user executes `load` command to the config files. - 5. The user executes `list` to show which SKU and release is selected and installed. - 6. The user executes `select` to select which SKU, release, version he wants to uninstall. + 1. Download and unzip the zip file to a folder. + 2. Open cmd.exe with Administrative privileges + 2. Execute Setup.ForcedUninstall.exe + 3. Press Y and hit enter to run the application. -The user executes `uninstall` to perform the total uninstall. +**Commands:** + + 1. help or /help or /? : Print usage. + 2. break : run the application and pause until the user hit any key. + 3. noprocess : run the application but does not uninstall anything. Roadmap ======== diff --git a/TotalUninstaller EULA.docx b/TotalUninstaller EULA.docx new file mode 100644 index 0000000000000000000000000000000000000000..d7578d817f2b0f21430302a9a729c1969fdb42e4 GIT binary patch literal 42202 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 cY-Kl0>yIo(gC-*MnS<e*MA!EAo4?}xO)Bpeg literal 0 HcmV?d00001 diff --git a/src/Uninstall_Wrapper/Program.cs b/src/Uninstall_Wrapper/Program.cs index 1db4be0..7c36307 100644 --- a/src/Uninstall_Wrapper/Program.cs +++ b/src/Uninstall_Wrapper/Program.cs @@ -26,9 +26,9 @@ namespace Microsoft.VS.Uninstaller string wixpdbsPathsFile = string.Empty; string[] wixpdbsPaths = null; string dataFilePath = string.Empty; - //args = new string[] { "noprocess", @"/wixpdbs:C:\Users\tobyhu\Desktop\test\paths.txt" }; - //args = new string[] { "noprocess", @"/binfile:C:\Users\tobyhu\Desktop\test\DataFile.bin" }; - //args = new string[] { "noprocess", @"/binfile:C:\Users\tobyhu\Desktop\test\DataFile.bin", @"/wixpdbs:\\dexshare01\Drops\tobyhu\wixpdbsPS\vsumain\Files.txt" }; + //args = new string[] { "noprocess", @"/wixpdbs:C:\Users\user\Desktop\test\paths.txt" }; + //args = new string[] { "noprocess", @"/binfile:C:\Users\user\Desktop\test\DataFile.bin" }; + //args = new string[] { "noprocess", @"/binfile:C:\Users\user\Desktop\test\DataFile.bin", @"/wixpdbs:\\myshare\Drops\user\wixpdbsPS\sub\Files.txt" }; if (args != null && args.Count() > 0) { foreach (var arg in args) @@ -132,8 +132,10 @@ namespace Microsoft.VS.Uninstaller ip.LoadFromDataFile(stream); } } - + ip.InstalledVisualStudioReport(); + Logger.LogWithOutput("WARNING: This executable is designed to cleanup/scorch all Preview/RC/RTM releases of Visual Studio 2013, Visual Studio 2015 and Visual Studio vNext."); + Logger.LogWithOutput("It should be used as the last resort to clean up the user's system before resorting to reimaging the machine. "); Logger.LogWithOutput("Would you like to continue? [Y/N]"); var action = Console.ReadLine(); if (!string.IsNullOrEmpty(action) && action.StartsWith("y", StringComparison.OrdinalIgnoreCase)) @@ -172,12 +174,8 @@ namespace Microsoft.VS.Uninstaller Console.WriteLine("Welcome to Total Uninstaller."); Console.WriteLine("Running this application will remove Visual Studio 2013/2015/vNext completely."); Console.WriteLine("It should be used as the last resort to clean up your machine."); - Console.WriteLine("The application contains a master list of UpgradeCodes and ProductCode (if no UpgradeCode in the MSI) for all preview/RC/RTM releases of Visual Studio 2013/2015/vNext."); Console.WriteLine("----------- Normal Usage --------------"); Console.WriteLine("Please run this application as administrator without any parameter."); - Console.WriteLine("----------- Advanced Usage ---------------------"); - Console.WriteLine(@"/binfile:C:\Users\user\Desktop\test\DataFile.bin can be passed in to override the list of things to uninstall."); - Console.WriteLine(@"/wixpdbs:C:\Users\tobyhu\Desktop\test\paths.txt can be passed in to generate a data file."); } #endregion Private Methods diff --git a/src/VS.ConfigurationManager/Package.cs b/src/VS.ConfigurationManager/Package.cs index 03fa7aa..6392de6 100644 --- a/src/VS.ConfigurationManager/Package.cs +++ b/src/VS.ConfigurationManager/Package.cs @@ -102,7 +102,7 @@ namespace Microsoft.VS.ConfigurationManager /// /// /// - public Package(string upgradecode, string productcode, string productversion, string productname, string chainingpackage, DateTime installDate, string installLocation, System.Uri url) + public Package(string upgradecode, string productcode, string productversion, string productname, string chainingpackage) { Initialize(); Type = PackageType.MSI; @@ -111,9 +111,6 @@ namespace Microsoft.VS.ConfigurationManager ProductVersion = productversion; ProductName = productname; ChainingPackage = chainingpackage; - InstallDate = installDate; - InstallLocation = installLocation; - Url = url; } /// @@ -126,7 +123,7 @@ namespace Microsoft.VS.ConfigurationManager /// /// /// - public Package(string productcode, string productversion, string productname, string chainingpackage, DateTime installDate, string installLocation, System.Uri url) + public Package(string productcode, string productversion, string productname, string chainingpackage) { Initialize(); Type = PackageType.MSI; @@ -134,9 +131,6 @@ namespace Microsoft.VS.ConfigurationManager ProductVersion = productversion; ProductName = productname; ChainingPackage = chainingpackage; - InstallDate = installDate; - InstallLocation = installLocation; - Url = url; } /// /// Overloaded value to allow a different value for PackageType to be set. @@ -149,7 +143,7 @@ namespace Microsoft.VS.ConfigurationManager /// /// /// - public Package(string productcode, string productversion, string productname, string chainingpackage, DateTime installDate, string installLocation, System.Uri url, PackageType type) + public Package(string productcode, string productversion, string productname, string chainingpackage, PackageType type) { Initialize(); Type = type; @@ -157,9 +151,6 @@ namespace Microsoft.VS.ConfigurationManager ProductVersion = productversion; ProductName = productname; ChainingPackage = chainingpackage; - InstallDate = installDate; - InstallLocation = installLocation; - Url = url; } #endregion Public Constructors diff --git a/src/VS.ConfigurationManager/Primitives.cs b/src/VS.ConfigurationManager/Primitives.cs index cd63f5f..cd8fa76 100644 --- a/src/VS.ConfigurationManager/Primitives.cs +++ b/src/VS.ConfigurationManager/Primitives.cs @@ -107,7 +107,6 @@ namespace Microsoft.VS.ConfigurationManager /// public string ApplyFilter(string Source) { - Logger.Log(String.Format(CultureInfo.InvariantCulture, "Applying filters"), Logger.MessageLevel.Verbose, AppName); foreach (Filter fil in filters) { Source = Source.Replace(fil.ReplaceSource, fil.ReplaceValue); } return Source; } @@ -137,19 +136,15 @@ namespace Microsoft.VS.ConfigurationManager Logger.Log(String.Format(CultureInfo.InvariantCulture, "Do we already have an object in memory?", AppName), Logger.MessageLevel.Verbose, AppName); if (installedmsis.FirstOrDefault() == null) { - var hi = ProductInstallation.GetProducts(null, null, UserContexts.All); Logger.Log(String.Format(CultureInfo.InvariantCulture, "No installpackages object found - creating", AppName), Logger.MessageLevel.Verbose, AppName); + installations = ProductInstallation.GetProducts(null, null, UserContexts.All) - .Where(ins => ins.ProductName != null) .Select(ins => new Package( this.GetUpgradeCode(ins.LocalPackage), ins.ProductCode, - ins.ProductVersion.ToString(), - ApplyFilter(ins.ProductName), - null, - (DateTime)ins.InstallDate, - ins.InstallLocation, - ins.UrlInfoAbout + ins.ProductVersion == null ? "0.0.0" : ins.ProductVersion.ToString(), + ApplyFilter(string.IsNullOrEmpty(ins.ProductName) ? "(NOTDEFINED)" : ins.ProductName), + null ) ) .OrderBy(ins => ins.ProductName).ToList(); @@ -182,8 +177,11 @@ namespace Microsoft.VS.ConfigurationManager foreach(var keyPath in keyPaths) { - Logger.LogWithOutput(string.Format("Deleting registry: {0}", keyPath)); - this.DeleteRegistryKey(keyPath); + if (!this.DoNotExecuteProcess) + { + Logger.LogWithOutput(string.Format("Deleting registry: {0}", keyPath)); + this.DeleteRegistryKey(keyPath); + } } } @@ -211,7 +209,7 @@ namespace Microsoft.VS.ConfigurationManager { try { - if (Directory.Exists(CommonApplicationDataDirectory)) + if (Directory.Exists(CommonApplicationDataDirectory) && !this.DoNotExecuteProcess) { Logger.LogWithOutput(string.Format("Deleting: {0}", CommonApplicationDataDirectory)); this.RecursivelyDeleteFolder(CommonApplicationDataDirectory);