我需要通过编程方式更改Windows服务的登录用户。我正在使用以下代码来实现:
string objPath = string.Format("Win32_Service.Name='{0}'", ServiceName);
using (ManagementObject service = new ManagementObject(new ManagementPath(objPath)))
{
object[] wmiParams = new object[11];
if (PredefinedAccount)
{
wmiParams[6] = "LocalSystem";
wmiParams[7] = "";
}
else
{
wmiParams[6] = ServiceUsername; // provided by user
wmiParams[7] = ServicePassword; // provided by user
}
object invokeResult = service.InvokeMethod("Change", wmiParams);
// handle invokeResult - no error up to this point
}
这段代码在90%的情况下工作正常,但在某些情况下由于登录失败无法启动服务。通常InvokeMetod不会出错,但尝试启动服务时会出现以下错误:
System.InvalidOperationException: 无法在计算机'.'上启动X服务--> System.ComponentModel.Win32Exception: 由于登录失败而无法启动服务。
解决方法很简单,我们只需要通过Windows界面输入相同的凭据即可解决问题。
因此我的问题是,是否有人在使用ManagementObject时遇到类似的问题?因为在某些情况下,它似乎没有将用户名和密码与Windows服务关联起来。