Sc.exeを使用して、開発サーバー(すべてWindows 2008 64ビット)でさまざまなサービスを作成するスクリプトがあります。
スクリプトには、サービスを実行するためのユーザーアカウントの設定が含まれていますが、パスワードを正しく設定できません。アカウント名は正常に設定されますが、サービスを開始しようとするとログオンに失敗します。サービススナップインでパスワードを手動で変更すると、正常に機能します...何が得られますか?
パスワードを引用符で囲んでも引用符を付けずに試しましたが、成功しませんでした。
私が使用するコマンドの例:sc create PackageProcessing5 binPath = "c:\ Program Files(x86).... exe" obj = na\sys-WSPackager password = "password"
私が言ったように、サービスは正常に作成され、スナップインをチェックすると、ユーザーアカウントも正しいです。パスワードだけがどういうわけか見落とされてしまいます。コマンドラインに間違ったパスワードを入力しても文句を言わないので、作成中にまったく検証されていないことに気づきましたか?
ここに何かアイデアはありますか?
いくつかのコマンドに分割する必要があります。以下の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
スクリプトに「scconfigpassword = <password>」を追加して、「sccreate」の後にrunasアカウントのパスワードを設定します。
同じ問題が発生し、「scconfig」を使用して修正しました。
問題は実際にはパスワードとはまったく関係がないと思います。おそらく、アカウントにSeServiceLogonRightビット(通常はGUIの「サービスとしてログオン」)を与えることを怠ったでしょう。 このWindows XP TechNetのリソースキットヘルプページ で名前を見つけました)ナレッジベースの記事を参照してください kb259733(Windows 2000) または kb327545(Windows Server 2003) からこれを行う方法GUIですが、コマンドラインからこれを実行したいと思っていると思います。そのためには、ntrightsを確認する必要があります。
これは、最初に自分のユーザーアカウントと、以前に作成した既存のサービスアカウントを使用して、同じ単純なサービスを実際に作成しようとしたことに基づいています。私自身のアカウントで、「scstart」から取得したのと同じエラーであると私が推測するものを取得しました。
ログオンに失敗したため、サービスを開始できませんでした。
サービスアカウントでは、代わりに次のエラーが発生しました。
サービスは、開始要求または制御要求にタイムリーに応答しませんでした。
この後者のエラーは、起動しようとしたプログラムが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が追加される可能性があることを示唆する以外に、なぜ修正されるのかはわかりません。これを試すたびに新しいアカウントを使用しているのでしょうか。手動で作成したアカウントでも試してみましたか?