У меня есть сценарий для создания различных служб на наших серверах разработки (все 64-разрядные версии Windows 2008) с использованием sc.exe.
Сценарий включает настройку учетной записи пользователя для запуска службы, но я никогда не могу правильно установить пароль. Он устанавливает имя учетной записи нормально, но всякий раз, когда я пытаюсь запустить службу, я получаю ошибку входа в систему. Если я вручную меняю пароль в сервисной оснастке, все работает нормально ... что дает ??
Я пробовал с паролем и без кавычек, безуспешно.
Пример используемой мной команды: sc create PackageProcessing5 binPath = "c: \ Program Files (x86) .... exe" obj = na \ sys-WSPackager password = "password"
Как я уже сказал, служба создается успешно, и когда я проверяю оснастку, учетная запись пользователя также верна. Просто пароль почему-то упускается из виду. Я заметил, что если я ввожу неправильный пароль в командную строку, он не жалуется, поэтому я думаю, он вообще не проверяет его во время создания?
Есть идеи здесь?
Его нужно разбить на несколько команд, попробуйте использовать скрипт Powershell ниже.
По сути, он добавляет учетную запись домена в SeServiceLogonRight, а затем создает и запускает службу с учетной записью домена.
Примечание. Powershell необходимо запускать от имени администратора.
Пример Powershell ниже - создать службу Windows (в данном случае агент TeamCity) и запустить ее как учетную запись домена:
$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
Добавьте в сценарий «sc config password = <password>», чтобы установить пароль учетной записи runas после «sc create».
Я столкнулся с той же проблемой и исправил ее с помощью "sc config".
Я думаю, что проблема на самом деле вовсе не связана с паролем: возможно, вы пренебрегли присвоением учетной записи бита SeServiceLogonRight (обычно «Вход в качестве службы» в графическом интерфейсе пользователя). Я нашел имя в эта страница справки по Windows XP Resource Kit на TechNet См. Статью в базе знаний kb259733 (Windows 2000) или kb327545 (Windows Server 2003) чтобы узнать, как это сделать из графического интерфейса, но я предполагаю, что вы действительно хотите сделать это из командной строки, для чего вам следует посмотреть ntrights.
Это основано на моей попытке сначала создать такую же простую службу с моей собственной учетной записью пользователя и с существующей учетной записью службы, которую я создал ранее. С моей учетной записью я получил то, что, как я полагаю, было той же ошибкой, что и вы при "sc start":
The service did not start due to a logon failure.
Вместо этого с учетной записью службы я получил эту ошибку:
The service did not respond to the start or control request in a timely fashion.
Я предполагаю, что последняя ошибка связана с тем, что программа, которую я пытался запустить, не была подготовлена для работы в качестве службы 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\фу password= бар
где Sam10
это имя моей системы (Windows XP Pro SP3).
Я действительно не могу сказать, почему повторный ввод пароля в графическом интерфейсе может исправить что-либо, кроме как предположить, что он может добавить SeServiceLogonRight к рассматриваемой учетной записи - использовали ли вы новые учетные записи каждый раз, когда пробовали это, или вы также пробовали с учетными записями, которые вы вручную заставили работать?