将服务启动类型更改为远程计算机中的延迟(自动)

时间:2017-05-30 05:12:02

标签: c# windows-services

我使用以下代码将远程服务器类型的服务启动更改为手动/自动使用C#。

public static void ChangeServiceStartupType()
    {

        string query1 = "select * from Win32_Service where name = 'myservice' ";


        string server = "servername";
        ConnectionOptions connectoptions = new ConnectionOptions();

        connectoptions.Username = @"username";
        connectoptions.Password = "password";

        ManagementScope scope = new ManagementScope(@"\\" + server + @"\root\cimv2");
        scope.Options = connectoptions;
        scope.Connect();

        ObjectQuery query = new ObjectQuery(query1);
        ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(scope, query);
        ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();
        foreach (ManagementObject mo in managementObjectSearcher.Get())
        {
            string name = mo.Properties["Name"].Value.ToString().Trim().ToLower();
            string state = mo.Properties["State"].Value.ToString().Trim();
            string startmode = mo.Properties["StartMode"].Value.ToString().Trim();
            changemode(mo, "Automatic");
        }
    }

这是changemode方法

private static void changemode(ManagementObject mo, string startmode)
    {
        ManagementBaseObject inParams = mo.GetMethodParameters("ChangeStartMode");
        inParams["startmode"] = startmode;
        ManagementBaseObject outParams = mo.InvokeMethod("ChangeStartMode", inParams, null);
        startmode = mo.Properties["StartMode"].Value.ToString().Trim();
    }

当我在更改模式(对象,启动模式参数)中传递参数手动自动时,服务启动类型会从自动更改为手动,反之亦然。但是,我无法将其更改为自动(延迟启动)。

我尝试自动延迟延迟自动自动(延迟启动)如何实现此目标?

3 个答案:

答案 0 :(得分:0)

查看documentation,似乎无法使用ChangeStartMode Win32方法延迟服务启动。如果你使用ServiceInstaller,那么做你想要的就相当简单:

myServiceInstaller.StartType = ServiceStartMode.Automatic;
myServiceInstaller.DelayedAutoStart = true;

但是,我猜这不是一个选择,所以我们必须深入挖掘。

Service类确实具有DelayedAutoStart属性,但它是只读的。如果你想把它设置为延迟,你将不得不乱用P / Invokes。我能找到的所有信息都指向ChangeServiceConfig2this结构。

或者,您可以执行此命令,它将具有相同的效果。但是,它并不能解决您的问题,只是一种解决方法。

sc.exe config myService start= delayed-auto

最后,请用户this查看Kramii(非常)长的答案,this查看Peter Kelly。他们两个都编写了帮助程序类,使这类事情变得更容易。我还没有对它们进行测试,但看起来很有希望。

答案 1 :(得分:0)

Sty的答案可让您将服务设置为在创建时自动延迟;不发布部署。

有一个可以执行此操作的命令行

sc \\computername config *servicename* start= delayed-auto

我使用WMI 管理类在远程服务器中运行此命令行,它运行正常。

有关如何远程启动流程的更多文档here

答案 2 :(得分:0)

如果有一种方法通过ManagementObject而不是我找不到它,但可以通过注册表:

public void SetDalayedAutoStart(string machineName, string serviceName)
{
    using (var regKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, machineName))
    {
        using (RegistryKey serviceKey = regKey.OpenSubKey(@"System\CurrentControlSet\Services\" + serviceName, true))
        {
            serviceKey.SetValue("DelayedAutostart", 1, RegistryValueKind.DWord);
        }
    }
}

注1 :这仅适用于具有自动启动类型的服务

注2 :只有在重启后才会在服务控件(services.msc)中看到新状态(不要问我为什么)