如何在 C# 中以编程方式将 Windows 服务的启动类型更改为禁用

Posted

技术标签:

【中文标题】如何在 C# 中以编程方式将 Windows 服务的启动类型更改为禁用【英文标题】:How to change the startup type of Windows service to Disabled programmatically in C# 【发布时间】:2020-08-28 17:36:51 【问题描述】:

您好,我正在尝试更改现有 Windows 服务的启动类型。说“Spooler”(打印后台处理程序)。我正在使用ServiceController

   var service = new ServiceController("Spooler");
                    service.Start();
                    service.WaitForStatus(ServiceControllerStatus.Running, 600);

虽然我能够启动/停止服务,但我无法弄清楚如何更改启动类型本身? (例如:禁用/自动/手动)

当我查看ServiceController 的定义时,我可以看到ServiceStartMode 正在被定义。有人可以帮助我如何设置此选项吗?我的需要是使用 ServiceControl 类或任何其他可行的方式以编程方式禁用 Windows 服务..

【问题讨论】:

这能回答你的问题吗? How to stop Windows service programmatically 您可能想查看Disable Windows service at application launch的答案 【参考方案1】:

最简单的方法是使用sc command tool:

将启动类型更改为禁用的示例:

sc config "mysql" start=disabled

请注意,您需要拥有管理员权限才能成功运行此命令。

用 C# 代码包装:

var startInfo = new ProcessStartInfo
               
    WindowStyle = ProcessWindowStyle.Hidden,
    FileName = "CMD.EXE",
    Arguments = string.Format("/C sc 0 1 2", "config", "MySql", "start=disabled"),
;

using (var process = new Process  StartInfo = startInfo)

    if (!process.Start())
    
        return;
    

    process.WaitForExit();

    Console.WriteLine($"Exit code is process.ExitCode");

更新: 使用process.Exit 代码检查处理操作是否成功。 0 ExitCode 表示成功。

注意:如果您在没有管理员权限的情况下运行进程/Visual Studio,ExitCode 将为 5(访问定义)。

【讨论】:

谢谢。事实上,我已经尝试过了。我在这里看到的问题是,在 process.Start() 之后,当我检查进程对象时,我看到了 InvalidOperationException。所以我不能依靠 Process 的“HasExited”属性来确定操作是否成功

以上是关于如何在 C# 中以编程方式将 Windows 服务的启动类型更改为禁用的主要内容,如果未能解决你的问题,请参考以下文章

如果应用程序具有应用程序清单,如何在 C# 中以编程方式获取?

在 C# 中以编程方式设置 Windows XP Embedded 区域设置

如何在 C# 中以编程方式获取 Lync 会议 URL?

如何在 Windows 中以编程方式切换用户

在 C# 中以编程方式创建 WCF 客户端的标头(wsse)部分

在c#中以编程方式查询网卡的入站/出站IPv4数据包计数统计