在远程机器中将服务启动类型更改为Delayed(自动)
问题描述:
我正在使用以下代码将远程服务器中的服务启动类型更改为手动/自动使用C#。在远程机器中将服务启动类型更改为Delayed(自动)
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();
}
当我传递参数手册或自动在changemode(对象,STARTMODE参数)服务启动从自动型的变化到手动,反之亦然。但是,我无法将其更改为自动(延迟启动)。
我试图自动延迟,延迟 - 自动,自动(延时启动)我如何实现这一目标?
答
看着documentation,似乎无法使用ChangeStartMode
Win32方法延迟服务启动。
myServiceInstaller.StartType = ServiceStartMode.Automatic;
myServiceInstaller.DelayedAutoStart = true;
不过我猜,是不是一种选择,所以我们必须深入挖掘:如果你使用ServiceInstaller
,像这样做你想要的东西是相当简单的。
Service类确实有DelayedAutoStart
属性,但它是只读的。如果你想把它设置为延迟,你将不得不乱用P/Invokes。我可以找到的所有信息指向ChangeServiceConfig2和this结构。
另外,你可以执行这个命令它会有相同的效果。但是,这不是真正的答案,只是一种解决方法。
sc.exe config myService start= delayed-auto
最后,检查出this(非常)由用户Kramii长的答案,并通过thisPeter Kelly。他们都写了助手类来让这样的事情变得更容易。我没有测试过它们,但看起来很有前途。
感谢@Sty您输入
更多的文档。我想出了一个办法:) –