我有一个脚本,使用 sc.exe 在我们的开发服务器(所有 Windows 2008 64 位)上创建各种服务。
脚本包括设置运行服务的用户帐户,但我始终无法正确设置密码。它可以很好地设置帐户名,但每当我尝试启动服务时,都会登录失败。如果我在服务管理单元中手动更改密码,它就可以正常工作...怎么回事?
我尝试过在密码周围加上和不加上引号,但都没有成功。
我使用的命令示例:sc create PackageProcessing5 binPath= "c:\Program Files (x86)....exe" obj= na\sys-WSPackager password= "password"
就像我说的,服务创建成功,当我检查管理单元时,用户帐户也是正确的。只是密码不知何故被忽略了。我注意到,如果我在命令行中输入了错误的密码,它不会发出抱怨,所以我猜它在创建过程中根本没有验证它?
这里有什么想法吗?
答案1
我认为问题实际上与密码无关:可能你忘记为帐户提供 SeServiceLogonRight 位(在 GUI 中通常是“以服务身份登录”)。我在TechNet 上的此 Windows XP 资源工具包帮助页面 查看知识库文章kb259733(Windows 2000)或者kb327545(Windows Server 2003)如何从 GUI 执行此操作,但我假设您确实想从命令行执行此操作,为此您应该查看 ntrights。
这是基于我尝试首先使用我自己的用户帐户和我之前创建的现有服务帐户创建相同的简单服务。使用我自己的帐户,我得到了我认为与您从“sc start”中得到的相同的错误:
由于登录失败,服务未启动。
使用服务帐户时,我收到此错误:
该服务未及时响应启动或控制请求。
我认为后一个错误是因为我尝试启动的程序没有准备好充当 NT 服务。(如果有帮助的话,起作用的 sc 命令没有在密码周围使用引号。)
仅供参考,两个命令的形式均为:
sc create xemacs-beta-repo binPath= "C:\Program Files\TortoiseHg\hg.exe serve -d -R C:\code\xemacs-beta -E C:\code\xemacs-beta.hg-serve.log" obj= Sam10\foo password= bar
Sam10
我的(Windows XP Pro SP3)系统的名称在哪里?
我真的说不出为什么在 GUI 中重新输入密码可以解决任何问题,除了建议它可能会将 SeServiceLogonRight 添加到相关帐户 - 您每次尝试此操作时是否都使用新帐户,或者您是否也尝试过使用手动设置的帐户?
答案2
在脚本中添加“sc config password= <password>”以在“sc create”之后设置 runas 帐户的密码。
我遇到了同样的问题,并使用“sc config”解决了它。
答案3
它需要分解成几个命令,请尝试使用下面的 Powershell 脚本。
基本上,它会将域帐户添加到 SeServiceLogonRight,然后使用域帐户创建并启动服务。
注意:Powershell 需要以管理员身份运行。
下面的 Powershell 示例是创建一个 Windows 服务(在本例中为 TeamCity Agent)并将其作为域帐户运行:
$accountToAdd = "mydomain\account" $sidstr = $null try { $ntprincipal = new-object System.Security.Principal.NTAccount "$accountToAdd" $sid = $ntprincipal.Translate([System.Security.Principal.SecurityIdentifier]) $sidstr = $sid.Value.ToString() } catch { $sidstr = $null } Write-Host "Account: $($accountToAdd)" -ForegroundColor DarkCyan if( [string]::IsNullOrEmpty($sidstr) ) { Write-Host "Account not found!" -ForegroundColor Red exit -1 } Write-Host "Account SID: $($sidstr)" -ForegroundColor DarkCyan $tmp = [System.IO.Path]::GetTempFileName() Write-Host "Export current Local Security Policy" -ForegroundColor DarkCyan secedit.exe /export /cfg "$($tmp)" $c = Get-Content -Path $tmp $currentSetting = "" foreach($s in $c) { if( $s -like "SeServiceLogonRight*") { $x = $s.split("=",[System.StringSplitOptions]::RemoveEmptyEntries) $currentSetting = $x[1].Trim() } } if( $currentSetting -notlike "*$($sidstr)*" ) { Write-Host "Modify Setting ""Log on as a service""" -ForegroundColor DarkCyan if( [string]::IsNullOrEmpty($currentSetting) ) { $currentSetting = "*$($sidstr)" } else { $currentSetting = "*$($sidstr),$($currentSetting)" } Write-Host "$currentSetting" $outfile = @" [Unicode] Unicode=yes [Version] signature="`$CHICAGO`$" Revision=1 [Privilege Rights] SeServiceLogonRight = $($currentSetting) "@ $tmp2 = [System.IO.Path]::GetTempFileName() Write-Host "Import new settings to Local Security Policy" -ForegroundColor DarkCyan $outfile | Set-Content -Path $tmp2 -Encoding Unicode -Force Push-Location (Split-Path $tmp2) try { secedit.exe /configure /db "secedit.sdb" /cfg "$($tmp2)" /areas USER_RIGHTS #write-host "secedit.exe /configure /db ""secedit.sdb"" /cfg ""$($tmp2)"" /areas USER_RIGHTS " } finally { Pop-Location } } else { Write-Host "NO ACTIONS REQUIRED! Account already in ""Log on as a service""" -ForegroundColor DarkCyan } Write-Host "Done." -ForegroundColor DarkCyan #Create Service and set Credentials cmd /c sc create TCAgent5 binPath= "C:\BuildAgent5\launcher\bin\TeamCityAgentService-windows-x86-32.exe -s C:\BuildAgent5\launcher\conf\wrapper.conf" DisplayName= "Team City Agent5" auto obj= account@mydomain Password= mypassword