using System; using System.Windows.Forms; using System.IO; using System.Collections; using Microsoft.Win32; using System.Configuration.Install; using System.ServiceProcess; using System.Diagnostics; namespace hhhh { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { UnService(); } private void UnService() { listBox1.Items.Clear(); string temp = null, tempType = null; object displayName = null, uninstallString = null, releaseType = null; RegistryKey currentKey = null; int softNum = 0; RegistryKey pregkey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall");//获取指定路径下的键 try { foreach (string item in pregkey.GetSubKeyNames()) //循环所有子键 { currentKey = pregkey.OpenSubKey(item); displayName = currentKey.GetValue("DisplayName"); //获取显示名称 uninstallString = currentKey.GetValue("UninstallString"); //获取卸载字符串路径 releaseType = currentKey.GetValue("ReleaseType"); //发行类型,值是Security Update为安全更新,Update为更新 bool isSecurityUpdate = false; if (releaseType != null) { tempType = releaseType.ToString(); if (tempType == "Security Update" || tempType == "Update") isSecurityUpdate = true; } if (!isSecurityUpdate && displayName != null && uninstallString != null) { softNum++; temp = displayName.ToString() + Environment.NewLine; SoftUninstallItem Uninitem = new SoftUninstallItem(); Uninitem.SoftName = temp.Trim(); string paraName; Uninitem.UninstallPath = getPath(uninstallString.ToString().Trim(), out paraName); Uninitem.UnitstallPara = paraName; listBox1.Items.Add(Uninitem); //listBox1.Items.Add(Environment.NewLine + temp + " 文件路径:" + uninstallString.ToString()); //textBox1.Text = Environment.NewLine + uninstallString.ToString(); } } } catch (Exception E) { MessageBox.Show(E.Message.ToString()); } label1.Text = "共有软件" + softNum.ToString() + "个"; //listBox1.Items.Add("共有软件" + softNum.ToString() + "个"); //textBox1.Text = "共有软件" + softNum.ToString() + "个" + Environment.NewLine + temp; pregkey.Close(); } /// <summary> /// 获取卸载路径和卸载参数 /// </summary> /// <param name="uninstallString"></param> /// <param name="ParaName"></param> /// <returns></returns> private string getPath(string uninstallString, out string ParaName) { ParaName = ""; int space = uninstallString.IndexOf("."); //获取路径中.exe中的. if (space < 1) return uninstallString.Trim(' ', '"'); space = uninstallString.IndexOf(" ", space);//获取路径中.exe 后的第一个空格 if (space < 1) return uninstallString; ParaName = uninstallString.Substring(space + 1).Trim(' ', '"'); //空格后面就是参数 return uninstallString.Substring(0, space).Trim(' ', '"'); //空格前面是卸载程序路径 } /// <summary> /// 卸载服务 /// </summary> /// <param name="p_Path">指定服务文件路径</param> /// <returns>卸载信息 正确卸载返回""</returns> public static string UnInsertService(string Q_Path) { if (!File.Exists(Q_Path)) return "文件不存在!"; FileInfo _InsertFile = new FileInfo(Q_Path); IDictionary _SavedState = new Hashtable(); try { AssemblyInstaller _AssemblyInstaller = new AssemblyInstaller(Q_Path, new string[] { "/LogFile=" + _InsertFile.DirectoryName + "//" + _InsertFile.Name.Substring(0, _InsertFile.Name.Length - _InsertFile.Extension.Length) + ".log" }); _AssemblyInstaller.UseNewContext = true; _AssemblyInstaller.Uninstall(_SavedState); _AssemblyInstaller.Commit(_SavedState); return ""; } catch (Exception ex) { return ex.Message; } } /// <summary> /// 检查服务是否存在 /// </summary> /// <param name="serviceName"> 服务名</param> /// <returns></returns> private bool ServiceIsExisted(string serviceName) { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController s in services) { if (s.ServiceName == serviceName) { return true; } } return false; } private void button2_Click(object sender, EventArgs e) { var item = listBox1.SelectedItem as SoftUninstallItem; if (item == null) return; Process p = new Process(); p.StartInfo.FileName = item.UninstallPath; p.StartInfo.Arguments = item.UnitstallPara; p.Start(); } /// <summary> /// 软件卸载信息实体 /// </summary> public class SoftUninstallItem { /// <summary> /// 软件名称 /// </summary> public string SoftName { get; set; } /// <summary> /// 软件路径 /// </summary> public string UninstallPath { get; set; } /// <summary> /// 参数 /// </summary> public string UnitstallPara { get; set; } public override string ToString() { return string.Format("软件名称:{0} 卸载路径:{1} {2}", SoftName, UninstallPath, UnitstallPara); } } } }