通过C#调用cmd来修改服务启动类型
- 作者: 亖呉?盀
- 来源: 51数据库
- 2021-08-16
可以使用system.serviceprocess.servicecontroller这个类允许连接到正在运行或者已停止的服务、对其进行操作或获取有关它的信息。servicecontroller 提供了开始和停止服务的方法(start, stop)。
但是这个类并没有提供修改服务启动类型的方法,可以通过c#调用cmd来修改
参考网上的这个方法:
//设置服务的启动类型
//sservicename服务名称
//istarttype要设置的启动类型 2:自动,3:手动,4:禁用
//返回成功状态 true:成功,false:失败
public boolean setwindowsservicestarttype(string sservicename, int istarttype)
{
try
{
system.diagnostics.processstartinfo objprocessinf = new system.diagnostics.processstartinfo();
objprocessinf.filename = "cmd.exe";
objprocessinf.createnowindow = false;
objprocessinf.windowstyle = system.diagnostics.processwindowstyle.hidden;
string sstartstate = "boot";
switch (istarttype)
{
case 1:
{
sstartstate = "system";
break;
}
case 2:
{
sstartstate = "auto";
break;
}
case 3:
{
sstartstate = "demand";
break;
}
case 4:
{
sstartstate = "disabled";
break;
}
default:
{
break;
}
}
objprocessinf.arguments = "/c sc config " + sservicename + " start= " + sstartstate;
system.diagnostics.process.start(objprocessinf);
return true;
}
catch
{
return false;
}
}
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.diagnostics;
using system.serviceprocess;
using microsoft.win32;
namespace service
{
public class classservice
{
private string servicename; //服务名称
private servicecontroller sc;
/// <summary>
/// 服务操作
/// </summary>
/// <param name="servicename">服务名称</param>
public classservice(string servicename)
{
this.servicename = servicename;
this.sc = new servicecontroller(servicename);
}
/// <summary>
/// 启动服务
/// </summary>
/// <returns></returns>
public bool startservice()
{
try
{
if (sc.status != servicecontrollerstatus.running)
sc.start();
else
return false;
}
catch (exception)
{
return false;
}
return true;
}
/// <summary>
/// 停止服务
/// </summary>
/// <returns></returns>
public bool stopservice()
{
try
{
if (sc.status != servicecontrollerstatus.stopped)
sc.stop();
else
return false;
}
catch (exception)
{
return false;
}
return true;
}
/// <summary>
/// 重启服务
/// </summary>
/// <returns></returns>
public bool restartservice()
{
if (stopservice())
{
if (startservice())
return true;
else
return false;
}
else
return false;
}
/// <summary>
/// 获取服务启动类型
/// </summary>
/// <returns>2:自动 3:手动 4:禁用 0:获取失败</returns>
public int getservicestartmode()
{
int mode = 0;
try
{
registrykey key = registry.localmachine.opensubkey(@"system\currentcontrolset\services" + servicename);
mode = convert.toint32(key.getvalue("start"));
key.close();
}
catch (exception)
{
return 0;
}
return mode;
}
/// <summary>
/// 设置服务启动类型
/// </summary>
/// <param name="mode">2:自动 3:手动 4:禁用</param>
/// <returns></returns>
public bool setservicestartmode(int mode)
{
try
{
registrykey key = registry.localmachine.opensubkey(@"system\currentcontrolset\services" + servicename, true);
key.setvalue("start", mode);
key.close();
}
catch (exception)
{
return false;
}
return true;
}
}
}
但是这个类并没有提供修改服务启动类型的方法,可以通过c#调用cmd来修改
参考网上的这个方法:
//设置服务的启动类型
//sservicename服务名称
//istarttype要设置的启动类型 2:自动,3:手动,4:禁用
//返回成功状态 true:成功,false:失败
复制代码 代码如下:
public boolean setwindowsservicestarttype(string sservicename, int istarttype)
{
try
{
system.diagnostics.processstartinfo objprocessinf = new system.diagnostics.processstartinfo();
objprocessinf.filename = "cmd.exe";
objprocessinf.createnowindow = false;
objprocessinf.windowstyle = system.diagnostics.processwindowstyle.hidden;
string sstartstate = "boot";
switch (istarttype)
{
case 1:
{
sstartstate = "system";
break;
}
case 2:
{
sstartstate = "auto";
break;
}
case 3:
{
sstartstate = "demand";
break;
}
case 4:
{
sstartstate = "disabled";
break;
}
default:
{
break;
}
}
objprocessinf.arguments = "/c sc config " + sservicename + " start= " + sstartstate;
system.diagnostics.process.start(objprocessinf);
return true;
}
catch
{
return false;
}
}
复制代码 代码如下:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.diagnostics;
using system.serviceprocess;
using microsoft.win32;
namespace service
{
public class classservice
{
private string servicename; //服务名称
private servicecontroller sc;
/// <summary>
/// 服务操作
/// </summary>
/// <param name="servicename">服务名称</param>
public classservice(string servicename)
{
this.servicename = servicename;
this.sc = new servicecontroller(servicename);
}
/// <summary>
/// 启动服务
/// </summary>
/// <returns></returns>
public bool startservice()
{
try
{
if (sc.status != servicecontrollerstatus.running)
sc.start();
else
return false;
}
catch (exception)
{
return false;
}
return true;
}
/// <summary>
/// 停止服务
/// </summary>
/// <returns></returns>
public bool stopservice()
{
try
{
if (sc.status != servicecontrollerstatus.stopped)
sc.stop();
else
return false;
}
catch (exception)
{
return false;
}
return true;
}
/// <summary>
/// 重启服务
/// </summary>
/// <returns></returns>
public bool restartservice()
{
if (stopservice())
{
if (startservice())
return true;
else
return false;
}
else
return false;
}
/// <summary>
/// 获取服务启动类型
/// </summary>
/// <returns>2:自动 3:手动 4:禁用 0:获取失败</returns>
public int getservicestartmode()
{
int mode = 0;
try
{
registrykey key = registry.localmachine.opensubkey(@"system\currentcontrolset\services" + servicename);
mode = convert.toint32(key.getvalue("start"));
key.close();
}
catch (exception)
{
return 0;
}
return mode;
}
/// <summary>
/// 设置服务启动类型
/// </summary>
/// <param name="mode">2:自动 3:手动 4:禁用</param>
/// <returns></returns>
public bool setservicestartmode(int mode)
{
try
{
registrykey key = registry.localmachine.opensubkey(@"system\currentcontrolset\services" + servicename, true);
key.setvalue("start", mode);
key.close();
}
catch (exception)
{
return false;
}
return true;
}
}
}
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
