您的位置:首页 > 编程语言 > C#

C#通过SC命令和静态公共类来操作Windows服务

2016-01-09 00:58 447 查看
调用的Windows服务应用程序网址:/article/6212139.html

一、引用





二、公共静态类:可以单独放到类库里

usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Configuration.Install;
usingSystem.Linq;
usingSystem.ServiceProcess;
usingSystem.Text;
usingMicrosoft.Win32;

namespaceCM.Web.UI
{
publicstaticclassWindowsServiceHelper
{
#region已封装Window服务

///<summary>
///安装服务
///</summary>
///<paramname="NameService">Windows服务显示名称</param>
///<returns>存在返回true,否则返回false;</returns>
publicstaticboolInstallService(stringserviceName)
{
boolflag=true;
if(!IsServiceIsExisted(serviceName))
{
try
{
stringlocation=System.Reflection.Assembly.GetExecutingAssembly().Location;
stringserviceFileName=location.Substring(0,location.LastIndexOf('\\')+1)+serviceName+".exe";

//测试用的绝对路径
//stringserviceFileName=@"F:\CM.WebSite\KJLMDemo\bin\Debug\KJLMDemo.exe";
InstallMyService(null,serviceFileName);
}
catch
{
flag=false;
}

}
returnflag;
}

///<summary>
///卸载服务
///</summary>
///<paramname="NameService">Windows服务显示名称</param>
///<returns>存在返回true,否则返回false;</returns>
publicstaticboolUninstallService(stringserviceName)
{
boolflag=true;
if(IsServiceIsExisted(serviceName))
{
try
{
stringlocation=System.Reflection.Assembly.GetExecutingAssembly().Location;
stringserviceFileName=location.Substring(0,location.LastIndexOf('\\')+1)+serviceName+".exe";
//测试用的绝对路径
//stringserviceFileName=@"F:\CM.WebSite\KJLMDemo\bin\Debug\KJLMDemo.exe";
UnInstallMyService(serviceFileName);
}
catch
{
flag=false;
}
}
returnflag;
}

///<summary>
///检查Windows服务是否存在
///</summary>
///<paramname="NameService">Windows服务显示名称</param>
///<returns>存在返回true,否则返回false;</returns>
publicstaticboolIsServiceIsExisted(stringserviceName)
{
ServiceController[]services=ServiceController.GetServices();
foreach(ServiceControllersinservices)
{
if(s.ServiceName.ToLower()==serviceName.ToLower())
{
returntrue;
}
}
returnfalse;
}

///<summary>
///安装Windows服务
///</summary>
///<paramname="stateSaver">集合</param>
///<paramname="filepath">Windows服务程序文件路径</param>
privatestaticvoidInstallMyService(IDictionarystateSaver,stringfilePath)
{
AssemblyInstallerAssemblyInstaller1=newAssemblyInstaller();
AssemblyInstaller1.UseNewContext=true;
AssemblyInstaller1.Path=filePath;
AssemblyInstaller1.Install(stateSaver);
AssemblyInstaller1.Commit(stateSaver);
AssemblyInstaller1.Dispose();
}

///<summary>
///卸载Windows服务
///</summary>
///<paramname="filePath">Windows服务程序文件路径</param>
privatestaticvoidUnInstallMyService(stringfilePath)
{
AssemblyInstallerAssemblyInstaller1=newAssemblyInstaller();
AssemblyInstaller1.UseNewContext=true;
AssemblyInstaller1.Path=filePath;
AssemblyInstaller1.Uninstall(null);
AssemblyInstaller1.Dispose();
}

///<summary>
///判断某个Windows服务是否启动
///</summary>
///<paramname="serviceName">Windows服务显示名称</param>
///<returns>bool</returns>
publicstaticboolIsServiceStart(stringserviceName)
{
ServiceControllerpsc=newServiceController(serviceName);
boolbStartStatus=false;
try
{
if(!psc.Status.Equals(ServiceControllerStatus.Stopped))
{
bStartStatus=true;
}

returnbStartStatus;
}
catch(Exceptionex)
{
thrownewException(ex.Message);
}
}

///<summary>
///修改服务的启动项2为自动,3为手动
///</summary>
///<paramname="startType">2为自动,3为手动</param>
///<paramname="serviceName">Windows服务显示名称</param>
///<returns>bool</returns>
publicstaticboolChangeServiceStartType(intstartType,stringserviceName)
{
try
{
RegistryKeyregist=Registry.LocalMachine;
RegistryKeysysReg=regist.OpenSubKey("SYSTEM");
RegistryKeycurrentControlSet=sysReg.OpenSubKey("CurrentControlSet");
RegistryKeyservices=currentControlSet.OpenSubKey("Services");
RegistryKeyservicesName=services.OpenSubKey(serviceName,true);
servicesName.SetValue("Start",startType);
}
catch(Exceptionex)
{
returnfalse;
}
returntrue;

}

///<summary>
///启动服务
///</summary>
///<paramname="serviceName">Windows服务显示名称</param>
///<returns>bool</returns>
publicstaticboolStartService(stringserviceName)
{
boolflag=true;
if(IsServiceIsExisted(serviceName))
{
System.ServiceProcess.ServiceControllerservice=newSystem.ServiceProcess.ServiceController(serviceName);
if(service.Status!=System.ServiceProcess.ServiceControllerStatus.Running&&service.Status!=System.ServiceProcess.ServiceControllerStatus.StartPending)
{
service.Start();
for(inti=0;i<60;i++)
{
service.Refresh();
System.Threading.Thread.Sleep(1000);
if(service.Status==System.ServiceProcess.ServiceControllerStatus.Running)
{
break;
}
if(i==59)
{
flag=false;
}
}
}
}
returnflag;
}

///<summary>
///停止服务
///</summary>
///<paramname="serviceName">Windows服务显示名称</param>
///<returns>bool</returns>
publicstaticboolStopService(stringserviceName)
{
boolflag=true;
if(IsServiceIsExisted(serviceName))
{
System.ServiceProcess.ServiceControllerservice=newSystem.ServiceProcess.ServiceController(serviceName);
if(service.Status==System.ServiceProcess.ServiceControllerStatus.Running)
{
service.Stop();
for(inti=0;i<60;i++)
{
service.Refresh();
System.Threading.Thread.Sleep(1000);
if(service.Status==System.ServiceProcess.ServiceControllerStatus.Stopped)
{
break;
}
if(i==59)
{
flag=false;
}
}
}
}
returnflag;
}
#endregion
}
}


三、静态公共类操作Windows服务-------控制台程序

usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Configuration.Install;
usingSystem.Diagnostics;
usingSystem.Linq;
usingSystem.ServiceProcess;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingMicrosoft.Win32;

namespaceConsoleService
{
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine("Window服务应用程序");
Console.WriteLine("请选择,[1]安装服务[2]卸载服务[3]启动服务[4]关闭服务[5]暂停/继续[6]检测服务");
varrs=int.Parse(Console.ReadLine());

//一、通过封装类操作Windows服务
switch(rs)
{
case1://安装服务
InstallService("ServiceDemo");
Console.WriteLine("安装成功");

break;
case2://卸载服务
UninstallService("ServiceDemo");
Console.WriteLine("卸载成功");
break;
case3://启动服务
StartService("ServiceDemo");
Console.WriteLine("启动服务成功");
break;
case4://关闭服务
StopService("ServiceDemo");
Console.WriteLine("关闭服务成功");
break;
case5://暂停/继续
ServiceControllerserviceControllerPauseToContinue=newServiceController("KJLMDemo");
if(serviceControllerPauseToContinue.CanPauseAndContinue)
{
if(serviceControllerPauseToContinue.Status==ServiceControllerStatus.Running)
serviceControllerPauseToContinue.Pause();
elseif(serviceControllerPauseToContinue.Status==ServiceControllerStatus.Paused)
serviceControllerPauseToContinue.Continue();
}
break;
case6://判断服务是否开启

Console.WriteLine("服务状态:"+IsServiceStart("ServiceDemo"));
break;
default:
break;
}
Console.ReadKey();
}
}
}


四、通过SC命令操作Windows服务-------控制台程序

usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Configuration.Install;
usingSystem.Diagnostics;
usingSystem.Linq;
usingSystem.ServiceProcess;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingMicrosoft.Win32;

namespaceConsoleService
{
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine("Window服务应用程序");
Console.WriteLine("请选择,[1]安装服务[2]卸载服务[3]启动服务[4]关闭服务[5]暂停/继续[6]检测服务");
varrs=int.Parse(Console.ReadLine());


//二、通过SC命令操作Windows服务
switch(rs)
{
case1://安装服务
//取当前服务的路径bin/debug下面的exe文件
stringpath=@"F:\CM.WebSite\KJLMDemo\bin\Debug\KJLMDemo.exe";
Process.Start("sc","createKJLMDemobinPath=\""+path+"\"");
Console.WriteLine("安装成功");

break;
case2://卸载服务
Process.Start("sc","deleteKJLMDemo");
Console.WriteLine("卸载成功");
break;
case3://启动服务
ServiceControllerserviceControllerStart=newServiceController("KJLMDemo");
serviceControllerStart.Start();
Console.WriteLine("启动服务成功");
break;
case4://关闭服务
ServiceControllerserviceControllerStop=newServiceController("KJLMDemo");
serviceControllerStop.Stop();
Console.WriteLine("关闭服务成功");
break;
case5://暂停/继续
ServiceControllerserviceControllerPauseToContinue=newServiceController("KJLMDemo");
if(serviceControllerPauseToContinue.CanPauseAndContinue)
{
if(serviceControllerPauseToContinue.Status==ServiceControllerStatus.Running)
serviceControllerPauseToContinue.Pause();
elseif(serviceControllerPauseToContinue.Status==ServiceControllerStatus.Paused)
serviceControllerPauseToContinue.Continue();
}
break;
case6://判断服务是否开启
ServiceControllerserviceControllerIsEnabled=newServiceController("KJLMDemo");
stringStatus=serviceControllerIsEnabled.Status.ToString();
Console.WriteLine("服务状态:"+Status);
break;
default:
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: