使用SC.exe设置服务凭据密码失败。

14

我知道这个问题过去已经有人问过,但并没有得到令人满意的答案。

我正在使用SC命令配置服务的凭据。

SC.exe config "SERVICE NAME" obj= "domain\user" password= "password"

操作完成,但是当我启动服务时,登录失败。
[NET START "service name"]

如果我只手动更新 services.msc 中的密码,然后启动服务,它就可以正常工作。

我有数百台服务器需要更新此更改,而且更改发生在部署的中间阶段,因此手动干预不是一个选择。

我尝试使用配置文件来更新登录帐户,然后使用另一个配置命令来更新密码。

根据所有账户,SC.exe 不适用于密码,Microsoft没有提供任何帮助。

有什么想法吗?


1
密码中是否包含任何特殊字符,例如(,)、'、"、$、>、<、^、?。如果是,则可能需要对它们进行转义。 - seva titov
2
我能够多次使用sc.exe来设置密码。你只需要正确编码密码即可。除了“@”和“&”之外,还有其他特殊字符吗?例如“%”需要特殊处理:https://dev59.com/pWkv5IYBdhLWcg3w3Ug0 - seva titov
基于这个简化的用例,似乎存在一个问题。使用Ansible win_service时也会出现相同的问题。我尝试在重新配置登录用户之前重启,但是没有任何作用。在使用默认用户创建服务后...失败:
  1. sc.exe config "myService" obj= "MYDOMAIN\myuser" password= "BAD"
  2. sc.exe config "myService" obj= "MYDOMAIN\myuser" password= "<redacted>"
成功:
  1. 通过Windows服务UI将密码设置为BAD。(黑魔法发生了)
  2. sc.exe config "myService" obj= "MYDOMAIN\myuser" password= "<redacted>"
- Mike Murray
10个回答

8
除了在进行更改之前停止服务授予用户作为服务登录的权限之外,我还必须添加type= own参数,否则会出现以下错误:
[SC] ChangeServiceConfig FAILED 87:

The parameter is incorrect

所以这是有效的命令:

SC.EXE config "ServiceName" type= own obj= "domain\user" password= "password"

即使密码中含有特殊字符,只要我将密码放在双括号之间,它也能正常工作。


"type =own" 对我没有影响。SC 命令无论是否带有 "type =own" 都不会报错。问题在于,成功创建服务后,由于登录问题,服务无法启动。用户账户已被授予服务登录权限。 - Faustas

7
当您通过服务属性窗口的普通路线配置服务以在特定帐户下运行时,系统会自动授予该帐户登录服务权限。当您使用sc.exe时,还必须授予用户登录服务权限。 登录服务权限

2

在重新启动服务之前,您应该授予用户作为服务登录的权限。不幸的是,使用默认的Windows工具无法从命令行完成此操作,但是您可以使用来自Windows Server 2003资源工具包的小型附加工具ntright.exe。

https://www.microsoft.com/en-us/download/details.aspx?id=17657下载它。

安装后,您将在C:\Program Files (x86)\Windows Resource Kits\Tools(或32位机器上的Program Files)中获得许多工具。

您需要ntrights.exe。您可以将其复制并从另一台主机上的任何位置运行。

要授予用户所需的权限,请将以下内容添加到脚本中:

ntrights.exe +r SeServiceLogonRight -u "%DOMAIN%\%USER%"

在此之后,您可以使用新用户成功重新启动服务。还有一种选项可以在远程主机上运行ntrights.exe:

ntrights.exe +r SeServiceLogonRight -u "%DOMAIN%\%USER%" -m %HOSTNAME%

这个工具在我需要远程重新配置很多主机时非常有帮助。

1

0
我有这个问题。多亏了ST在原帖的评论,我意识到需要研究如何输入密码。在我的情况下,我需要在密码中加倍百分号 (%%) 。
ST提供的链接很有帮助:cmd中转义特殊字符

0

在设置密码之前尝试停止服务:

sc.exe stop "<my_service>" 4:4:3
sc.exe config "<my_service>" obj= "\.<local_acc_name>" password= "<local_acc_pass>"
sc.exe start "<my_service>"

0

试试这个。 开始菜单 - 输入“本地安全策略”(不带引号)。打开“本地策略”,然后左键单击“用户权限分配”。在右侧面板上,右键单击“作为服务登录”,然后选择“属性”。单击“添加用户或组”,添加您的用户。点击确定。您可能需要重新启动计算机。

添加后,您可以在cmd中设置服务的用户名和密码。


0

在进行一些PowerShell脚本编写时遇到了这个问题,我的情况是密码中有特殊字符。

通过将密码存储在带双引号的变量中使其正常工作:

$servicePassword = "`"passwordWithSpecialCharacters`"" cmd /c sc config myService obj= mydomain\myuser password= $servicePassword

特殊字符包括:

()'"$><^?


0

当您配置一个服务以在特定虚拟账户下运行时,

要配置一个服务使用虚拟账户,请记住虚拟服务账户的名称应与服务名称相同。例如:**NT SERVICE**ServiceName。


0

基于这个简化的用例,似乎存在一个核心问题,即在不使用GUI的情况下更改密码。当使用Ansible win_service时,同样的问题也会出现。我尝试在重新配置登录用户之前重启,但是没有任何作用。在创建具有默认用户的服务后...

失败:

  1. sc.exe config "myService" obj= "MYDOMAIN\myuser" password= "BAD"
  2. sc.exe config "myService" obj= "MYDOMAIN\myuser" password= "redacted"

成功:

  1. 通过Windows服务UI将密码设置为BAD。(黑魔法正在发生)
  2. sc.exe config "myService" obj= "MYDOMAIN\myuser" password= "redacted"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接