【发布时间】:2009-06-08 19:00:11
【问题描述】:
如何从命令行更改 Windows 服务的用户凭据?
【问题讨论】:
-
与程序员无关,请尝试 serverfault.com 解决此类问题。
标签: command-line windows-services
如何从命令行更改 Windows 服务的用户凭据?
【问题讨论】:
标签: command-line windows-services
sc.exe config "Service Name" obj= "DOMAIN\User" password= "password" type= own
见Shortcut Setting Log-On Credentials for Windows Services » jonathanmalek.com。
@MattT 指出在 Windows Server 2008R2 上您必须添加 type= own,但在该版本之前没有必要。
在 PowerShell 3+ 中,您可以避免使用 stop-parsing symbol 转义参数:--%
sc.exe --% config "Service Name" obj= "DOMAIN\User" password= "password" type= own
【讨论】:
sc.exe \\servername config …(需要反斜杠)technet.microsoft.com/en-us/library/cc990290.aspx
% 导致服务登录失败,直到我将其更改为 %%。见stackoverflow.com/a/27451200/550712。
我只是从 powershell 调用 WMI 来执行此操作。
$Svc = Get-WmiObject win32_service -filter "name='ServiceName'"
$Svc.Change($Null, $Null, $Null, $Null, $Null, $Null, "User", "Password")
事后别忘了重启服务:
Stop-Service -Name 'ServiceName'
Start-Service -Name 'ServiceName'
有关 WMI 和服务的更多乐趣,请参阅 Win32_Service Class
【讨论】:
使用 WMI 会导致您的机器与您正在更改服务凭据的机器之间进行非加密通信。所以你的新密码很容易被嗅探。您只需解析通过网络发送的 WMI blob。到目前为止,我发现没有真正安全的方法可以使用工具远程更改服务帐户密码。
【讨论】:
对于那些想知道如何传递安全密码的人:
$credentials = Get-Credential -UserName 'Domain\username' -Message 'Enter password below'
$service = Get-WmiObject win32_service -filter "name='SERVICE_NAME'"
$service.Change($null,$null,$null,$null,$null,$null,$credentials.username,($credentials.Password | ConvertFrom-SecureString))
【讨论】: