我需要以编程方式更改 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 服务相关联?
这是因为该帐户没有“作为服务登录”权限。您需要使用 LsaAddAccountRights 为帐户添加此类权限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)