ChangeServiceConfig,参见ChangeServiceConfig on pinvoke.net 1.使用Change作为方法名称的ManagementObject.InvokeMethod。 这两种方式似乎都不是一种非常“友好”的方式,我想知道我是否错过了另一种更好的方式来做到这一点。
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
namespace ServiceTest
{
class Program
{
static void Main(string[] args)
{
string theServiceName = "My Windows Service";
string objectPath = string.Format("Win32_Service.Name='{0}'", theServiceName);
using (ManagementObject mngService = new ManagementObject(new ManagementPath(objectPath)))
{
object[] wmiParameters = new object[11];
wmiParameters[6] = @"domain\username";
wmiParameters[7] = "password";
mngService.InvokeMethod("Change", wmiParameters);
}
}
}
}
using System;
using System.Management;
namespace ChangeServiceCredentials
{
public class ServiceUtil
{
/// <summary>
/// Changes the user that a service runs under.
/// </summary>
/// <param name="serviceName">Name of the service to alter.</param>
/// <param name="userName">Username to use as the new identity.</param>
/// <param name="password">Password of the new identity.</param>
public static UInt32 SetWindowsServiceCredentials(String serviceName, String userName, String password)
{
var servicePath = $"Win32_Service.Name='{serviceName}'";
using (var service = new ManagementObject(new ManagementPath(servicePath)))
{
var wmiParams = new Object[10];
wmiParams[6] = userName;
wmiParams[7] = password;
return (UInt32)service.InvokeMethod("Change", wmiParams);
}
}
}
}
3条答案
按热度按时间5ktev3wc1#
下面是一个使用System.Management类的快速而肮脏的方法。
xhv8bpkk2#
ChangeServiceConfig是我过去使用的方法。WMI可能有点不稳定,我只想在没有其他选择的情况下使用它,尤其是在远程计算机上。
ulydmbyx3#
下面是一个使用System.Management类的带有参数和返回值的方法。