internal static ProgressTracker StartProgress(ProgressTracker parentTracker, string message, Request request) { if (request == null) { return null; } // if parent tracker is null, use 0 for parent id, else use the progressid of parent tracker return new ProgressTracker(request.StartProgress(parentTracker == null ? 0 : parentTracker.ProgressID, message)); }
private static bool ExecuteUninstallCommand(string fastPackageReference, Request request, string file, string args) { Timer timer = null; object timerLock = new object(); bool cleanUp = false; ProgressTracker tracker = new ProgressTracker(request.StartProgress(0, Resources.Messages.Uninstalling)); double percent = tracker.StartPercent; Action cleanUpAction = () => { lock (timerLock) { // check whether clean up is already done before or not if (!cleanUp) { try { if (timer != null) { // stop timer timer.Change(Timeout.Infinite, Timeout.Infinite); timer.Dispose(); timer = null; } } catch { } cleanUp = true; } } }; var start = new ProcessStartInfo { FileName = file, Arguments = args, UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true, //LoadUserProfile = true, }; using (var proc = Process.Start(start)) { // percent between startProgress and endProgress var progressPercent = tracker.ConvertPercentToProgress(percent += 0.01); request.Progress(tracker.ProgressID, (int)progressPercent, Resources.Messages.RunningCommand, file); if (proc == null) { return false; } timer = new Timer(_ => { percent += 0.025; if (progressPercent < 90) { request.Progress(tracker.ProgressID, (int) progressPercent, Resources.Messages.RunningCommand, file); } if (request.IsCanceled) { cleanUpAction(); } }, null, 0, 3000); proc.WaitForExit(); if (proc.ExitCode != 0) { request.Error(ErrorCategory.InvalidOperation, fastPackageReference, Resources.Messages.UninstallFailed, file, proc.StandardError.ReadToEnd()); request.CompleteProgress(tracker.ProgressID, false); return false; } request.CompleteProgress(tracker.ProgressID, true); return true; } }
private static bool YieldPackages(string hive, RegistryKey regkey, string name, string displayname, string requiredVersion, string minimumVersion, string maximumVersion, PackageJson package, Request request) { //TODO make it wildcard match, follow the fastfrence format, get-package git no results, get-package git* if (regkey != null) { var includeSystemComponent = request.GetOptionValue("IncludeSystemComponent").IsTrue(); foreach (var key in regkey.GetSubKeyNames()) { var subkey = regkey.OpenSubKey(key); if (subkey != null) { var properties = subkey.GetValueNames().ToDictionaryNicely(each => each.ToString(), each => (subkey.GetValue(each) ?? string.Empty).ToString(), StringComparer.OrdinalIgnoreCase); //if (!includeWindowsInstaller && properties.ContainsKey("WindowsInstaller") && properties["WindowsInstaller"] == "1") //{ // continue; //} if (!includeSystemComponent && properties.ContainsKey("SystemComponent") && properties["SystemComponent"] == "1") { continue; } var productName = ""; if (!properties.TryGetValue("DisplayName", out productName)) { // no product name? continue; } if (IsMatch(name, productName) || IsMatch(displayname, productName)) { var productVersion = properties.Get("DisplayVersion") ?? ""; var publisher = properties.Get("Publisher") ?? ""; var uninstallString = properties.Get("QuietUninstallString") ?? properties.Get("UninstallString") ?? ""; var comments = properties.Get("Comments") ?? ""; var fp = hive + @"\" + subkey; if (!string.IsNullOrEmpty(requiredVersion)) { if (new SemanticVersion(requiredVersion) != new SemanticVersion(productVersion)) { continue; } } else { if (!string.IsNullOrEmpty(minimumVersion) && new SemanticVersion(minimumVersion) > new SemanticVersion(productVersion)) { continue; } if (!string.IsNullOrEmpty(maximumVersion) && new SemanticVersion(maximumVersion) < new SemanticVersion(productVersion)) { continue; } } fp = PackageSourceListRequest.MakeFastPathComplex(package.Destination ?? "", package.Name, package.DisplayName, productVersion, fp); var source = properties.Get("InstallLocation") ?? ""; //we use name here because find-package uses name (not displayname) in the PSL.json, if (request.YieldSoftwareIdentity(fp, name, productVersion, "unknown", comments, source, name, "", "") != null) { if (properties.Keys.Where(each => !string.IsNullOrWhiteSpace(each)).Any(k => request.AddMetadata(fp, k.MakeSafeFileName(), properties[k]) == null)) { return false; } } } } } } return true; }
private static bool YieldPackage(string path, string searchKey, Dictionary<string, string> properties, Request request) { var productName = properties.Get("DisplayName") ?? ""; var productVersion = properties.Get("DisplayVersion") ?? ""; var publisher = properties.Get("Publisher") ?? ""; var uninstallString = properties.Get("QuietUninstallString") ?? properties.Get("UninstallString") ?? ""; var comments = properties.Get("Comments") ?? ""; var source = properties.Get("InstallLocation") ?? ""; if (request.YieldSoftwareIdentity(path, productName, productVersion, "unknown", comments, source, searchKey, "", "") != null) { if (properties.Keys.Where(each => !string.IsNullOrWhiteSpace(each)).Any(k => request.AddMetadata(path, k.MakeSafeFileName(), properties[k]) == null)) { return false; } } return true; }
internal static void GetInstalledExePackages(PackageJson package, string requiredVersion, string minimumVersion, string maximumVersion, Request request) { if (request == null) { throw new ArgumentNullException("request"); } request.Debug("Calling '{0}::GetInstalledPackages' '{1}','{2}','{3}','{4}'", Constants.ProviderName, package.Name, requiredVersion, minimumVersion, maximumVersion); #if !CORECLR if (Environment.Is64BitOperatingSystem) { using (var hklm64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey)) { #else if (System.Runtime.InteropServices.RuntimeInformation.OSArchitecture == System.Runtime.InteropServices.Architecture.X64) { using (var hklm64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")) { #endif if (!YieldPackages("hklm64", hklm64, package.Name, package.DisplayName, requiredVersion, minimumVersion, maximumVersion, package, request)) { return; } } using (var hkcu64 = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64).OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", false)) { if (!YieldPackages("hkcu64", hkcu64, package.Name, package.DisplayName, requiredVersion, minimumVersion, maximumVersion, package, request)) { return; } } } using (var hklm32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", false)) { if (!YieldPackages("hklm32", hklm32, package.Name, package.DisplayName, requiredVersion, minimumVersion, maximumVersion, package, request)) { return; } } using (var hkcu32 = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", false)) { if (!YieldPackages("hkcu32", hkcu32, package.Name, package.DisplayName, requiredVersion, minimumVersion, maximumVersion, package, request)) { } } }