以编程方式更改Windows服务用户

Ann*_*nne 9 .net c# windows-services

我需要以编程方式更改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
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于90%的情况,但在某些情况下,由于登录失败,无法启动服务.InvokeMetod通常没有错误,但是当我们尝试启动服务时,我们收到以下错误:

System.InvalidOperationException:无法在计算机'.'上启动服务X. - > System.ComponentModel.Win32Exception:由于登录失败,服务未启动.

解决方案解决方案很简单,我们只需要通过Windows界面输入相同的凭据,问题就解决了.

所以我的问题是,有没有人遇到过与ManagementObject类似的问题,因为在某些情况下它似乎没有将用户名和密码与windows服务联系起来?

tru*_*ger 9

我不确定这个问题是否已经解决.但我们刚刚遇到了类似的问题,我们发现这是因为该帐户没有"作为服务登录"权限.您需要使用LsaAddAccountRights向帐户添加此类权限.

请查看这篇文章:

如何在Windows NT中以编程方式管理用户权限


fli*_*ubt 0

您注意到这些失败中有什么规律吗?同一台机器?相同的操作系统?同一用户?用户是否具有“作为服务登录”或“交互登录”权限?就我个人而言,我不熟悉这种指定服务用户的方法。我本以为你必须重新启动该服务,但我想如果它在 90% 的时间内都能正常工作,我想就不需要了。