using CnasSynchronousCommon; using CnasSynchronusClient; using CnasSynchrousModel; using Microsoft.Win32; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration.Install; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.ServiceProcess; using System.Text; using System.Windows.Forms; using System.Xml.Serialization; namespace CNAS_DBSync { public partial class frmServiceConfig : Form { ServiceConfig serviceConfig = new ServiceConfig(); public frmServiceConfig() { InitializeComponent(); } private void frmServiceConfig_Load(object sender, EventArgs e) { //1.读取本地配置文件,填充上次配置时间 try { XmlSerializer serializer = new XmlSerializer(serviceConfig.GetType()); FileStream stream = new FileStream(FileHelper.getBasePath() + "/DataConfig/SyncServiceData.xml", FileMode.Open); serviceConfig = (ServiceConfig)serializer.Deserialize(stream); stream.Close(); this.numService.Value = serviceConfig.Minutes; this.dtpSource.Value = serviceConfig.InitalDT; this.cbxAutoStart.Checked = getServiceStartType("SyncService") == 2 ? true : false; } catch (Exception ex) { AppLog.Error(ex.Message); } //2.检查本地是否存在已经启动的服务,初始化btn的显示 string strMsg = IfStartService(); switch (strMsg) { case "1": btnInstallService.Text = "安装服务"; btnRun.Text = "启动服务"; this.numService.Enabled = true; break; case "2": btnInstallService.Text = "卸载服务"; btnRun.Text = "启动服务"; this.numService.Enabled = true; break; case "3": btnInstallService.Text = "卸载服务"; btnRun.Text = "停止服务"; this.numService.Enabled = false; break; } } private string IfStartService() { ServiceController[] service = ServiceController.GetServices(); string strMsg = "1"; for (int i = 0; i < service.Length; i++) { if (service[i].DisplayName.ToUpper().Equals("SyncService".ToUpper())) { strMsg = "2"; if (service[i].Status == ServiceControllerStatus.Running) { strMsg = "3"; break; } } } return strMsg; } private void btnRun_Click(object sender, EventArgs e) { if (btnRun.Text == "启动服务") //此时启动服务 { if (this.numService.Value < 1) { MessageBox.Show("服务至少每隔1分钟执行"); return; } serviceConfig.Minutes = (Int32)this.numService.Value; serviceConfig.InitalDT = this.dtpSource.Value; //修改服务为开启启动 if(cbxAutoStart.Checked) ChangeServiceStartType(2, "SyncService"); if (StartService()) { SaveServiceConfig(serviceConfig); //存储配置文件 btnRun.Text = "停止服务"; } else { MessageBox.Show("启动服务失败!"); } } else //此时停止服务 { if (StopService()) { if (cbxAutoStart.Checked) { ChangeServiceStartType(3, "SyncService"); cbxAutoStart.Checked = false; } btnRun.Text = "启动服务"; } else { MessageBox.Show("停止服务失败!"); } } } private bool StartService() { bool bIfSuccess = true; try { ServiceController serviceController = new ServiceController("SyncService"); serviceController.Start(); serviceController.WaitForStatus(ServiceControllerStatus.Running); serviceController.Close(); } catch (Exception ex) { bIfSuccess = false; AppLog.Error(ex.Message); } return bIfSuccess; } private bool StopService() { bool bIfSuccess = true; try { ServiceController serviceController = new ServiceController("SyncService"); serviceController.Stop(); serviceController.WaitForStatus(ServiceControllerStatus.Stopped); serviceController.Close(); } catch (Exception ex) { bIfSuccess = false; AppLog.Error(ex.Message); } return bIfSuccess; } private void SaveServiceConfig(ServiceConfig config) { try { XmlSerializer serializer = new XmlSerializer(config.GetType()); TextWriter writer = new StreamWriter(FileHelper.getBasePath() + "/DataConfig/SyncServiceData.xml"); serializer.Serialize(writer, config); writer.Close(); } catch (Exception ex) { AppLog.Error(ex.Message); } } /// /// 修改服务的启动项 2为自动,3为手动 /// /// /// /// public static bool ChangeServiceStartType(int startType, string serviceName) { try { RegistryKey regist = Registry.LocalMachine; RegistryKey sysReg = regist.OpenSubKey("SYSTEM"); RegistryKey currentControlSet = sysReg.OpenSubKey("CurrentControlSet"); RegistryKey services = currentControlSet.OpenSubKey("Services"); RegistryKey servicesName = services.OpenSubKey(serviceName, true); servicesName.SetValue("Start", startType); } catch (Exception ex) { AppLog.Error(ex.Message); return false; } return true; } /// /// 获取服务启动类型 /// /// /// public static int getServiceStartType(string serviceName) { int startType = 0; try { RegistryKey regist = Registry.LocalMachine; RegistryKey sysReg = regist.OpenSubKey("SYSTEM"); RegistryKey currentControlSet = sysReg.OpenSubKey("CurrentControlSet"); RegistryKey services = currentControlSet.OpenSubKey("Services"); RegistryKey servicesName = services.OpenSubKey(serviceName, true); if(servicesName != null) startType=(int)servicesName.GetValue("Start"); } catch (Exception ex) { AppLog.Error(ex.Message); return 0; } return startType; } private void btnInstallService_Click(object sender, EventArgs e) { string serviceFilePath = FileHelper.getBasePath() + @"\CNAS_SyncService.exe"; if (btnInstallService.Text == "安装服务") { if (InstallService(serviceFilePath)) { btnInstallService.Text = "卸载服务"; } else { MessageBox.Show("安装服务失败。"); } } else if (btnInstallService.Text == "卸载服务") { if (UninstallService(serviceFilePath)) { btnInstallService.Text = "安装服务"; btnRun.Text = "启动服务"; } else { MessageBox.Show("卸载服务失败。"); } } } /// /// 安装服务 /// /// private bool InstallService(string serviceFilePath) { bool bIfSuccess = true; try { using (AssemblyInstaller installer = new AssemblyInstaller()) { installer.UseNewContext = true; installer.Path = serviceFilePath; IDictionary savedState = new Hashtable(); installer.Install(savedState); installer.Commit(savedState); } } catch (Exception ex) { bIfSuccess = false; AppLog.Error(ex.Message); } return bIfSuccess; } /// /// 卸载服务 /// /// private bool UninstallService(string serviceFilePath) { bool bIfSuccess = true; try { using (AssemblyInstaller installer = new AssemblyInstaller()) { installer.UseNewContext = true; installer.Path = serviceFilePath; installer.Uninstall(null); } } catch (Exception ex) { bIfSuccess = false; AppLog.Error(ex.Message); } return bIfSuccess; } } }