Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式更改Windows服务用户_C#_.net_Windows Services - Fatal编程技术网

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

C# 以编程方式更改Windows服务用户,c#,.net,windows-services,C#,.net,Windows Services,我需要以编程方式更改Windows服务的登录用户。我使用以下代码来实现这一点: string objPath = string.Format("Win32_Service.Name='{0}'", ServiceName); using (ManagementObject service = new ManagementObject(new ManagementPath(objPath))) { object[] wmiParams = new object[11]; if (Predefin

我需要以编程方式更改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服务关联起来

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

这是因为该帐户没有“作为服务登录”权限。您需要使用lsaaddaccountrys将此权限添加到帐户

请查看本文:


我想知道是不是因为你的使用声明。我的意思是,ManagementObject在允许完成之前就被销毁了?我不太熟悉WMI,所以我不确定。因为用户名和密码是用户输入的,所以我也会在那里查找问题。确保它们是有效的名称。“域\用户名”在任何系统中都很好,但是username@DOMAIN“在Windows 2000及更早版本中不起作用。我们也有同样的问题,我很确定该服务是用C#,.net 1.1安装程序安装的。我从命令行('net start')启动服务,但登录失败。奇怪的是,机器上安装了7个服务中的2个(可能使用相同的安装代码)。我还没有时间去诊断它,但这台机器是Windows2003Server,带有最新的服务包。这些服务是c#.net 2.0代码。手动键入密码可以修复它,直到重新启动。@HVS:是的,我们强制他们输入用户名为“域\用户名”。我认为HVS的第一条评论有一定的价值。在登录完成之前,WMI对象可能已被释放,尤其是在登录引用另一台计算机上控制的域或目录时。用户以交互方式登录后,凭据可能会被缓存,这可能解释了为什么它对您有效。尝试在测试登录的内容上循环,这将使WMI对象保持足够长的活动时间以进行登录。或者删除using语句。这取决于不同的操作系统。没有模式。有时,如果密码很短(少于7个字符),就会发生这种情况。在所有这些情况下,当用户通过Windows默认界面输入相同的用户名和密码时,问题就解决了。因此,我们假设这是我们的代码或我们正在使用的管理对象中的某个内容。这是一个旧答案,仅部分链接答案。请在答案中添加墨水的基本部分。