我需要以编程方式更改Windows服务的Logon用户。我正在使用以下代码来执行此操作:
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服务相关联?
答案 0 :(得分:9)
这是因为该帐户没有“作为服务登录”权限。您需要使用LsaAddAccountRights向帐户添加此类权限。
请查看此文章:
How To Manage User Privileges Programmatically in Windows NT
答案 1 :(得分:0)
你是否注意到这些失败中的任何模式?同一台机器?相同的OS?相同的用户?用户是否具有“logon as service”或“以交互方式登录”权限?就个人而言,我不熟悉这种为服务指定用户的方法。我原本以为你必须重新启动服务,但我想如果它能在90%的时间内正常工作。