web-dev-qa-db-ja.com

sc.exe config "Service Name" obj = "DOMAIN \ User" password = "password"が機能していません

Cmdからサービスのパスワードを設定したい。私はオプションを得ました

sc.exe config "Service Name" obj = "DOMAIN\User" password = "password"

実行すると、 "[SC] ChangeServiceConfig SUCCESS"が表示され、サービスを開始すると、

"Windowsはローカルコンピューターでservice1サービスを開始できませんでした。エラー1069:ログオンに失敗したため、サービスを開始できませんでした。"

以下のリンクを検索して取得しました SC.exeを使用してサービス資格情報のパスワードを設定すると失敗します

私のパスワードは特殊文字で構成されていません。

それを行うためのオプションは何ですか?

11
Paul

アカウントYourDomain\YourUserにサービスとしてのログオン権が付与されている場合は、PowerShellスクリプトリンクを実行する必要があります AddLogonasaService =そしてこれはあなたのパスワードとは何の関係もありません。ユーザーがサービスを実行することは権利/許可です。

参照用にコードを埋め込んでいます。そのURLも参照できます。

param($accountToAdd)
 #written by Ingo Karstein, http://blog.karstein-consulting.com
 #  v1.0, 01/03/2014

 ## <--- Configure here

 if( [string]::IsNullOrEmpty($accountToAdd) ) {
    Write-Host "no account specified"
    exit
 }

 ## ---> End of Config

 $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 ""Logon 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

    #notepad.exe $tmp2
    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 ""Logon as a Service""" -ForegroundColor DarkCyan
 }

 Write-Host "Done." -ForegroundColor DarkCyan

サービスのIDを設定するために、vbscriptを使用しました

Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name = 'Servicename'")
For Each objservice in colServiceList   
errReturn = objService.Change( , , , , , ,WScript.Arguments.Item(0),   WScript.Arguments.Item(1)) 
objService.StartService()   
Next

ここで、WScript.Arguments.Item(0)はユーザー名argであり、WScript.Arguments.Item(1)はパスワードです。

3
Paul

最初に確認することは、そのユーザーがそのマシンでサービスとしてログオンする権限を持っているかどうかです。もしそうなら(そしてあなたはこれをチェックするために次の手順を行うことができます)、ただサービスに行きます(スタートメニュー-引用符なしで「サービス」と入力します)。リストからサービスを見つけて右クリックします。 「プロパティ」を選択し、「ログオン」タブに移動します。 「パスワード」と「パスワードの確認」を再入力します。 [OK]をクリックします。ユーザーがサービスとしてログオンする権限を持っている場合は、「アカウントYourDomain\YourUserにサービスとしてのログオン権が付与されています」というメッセージが表示されます。 。もう一度サービスを開始してみてください。それでうまくいきます。

ユーザーにこの種の権限がない場合は、次の2つの方法のいずれかを使用できます。

1)スタートメニュー-引用符なしで「ローカルセキュリティポリシー」と入力します。 「ローカルポリシー」を開き、「ユーザー権利の割り当て」を左クリックします。右側のパネルで、[サービスとしてログオン]を右クリックし、[プロパティ]を選択します。 「ユーザーまたはグループの追加」をクリックして、ユーザーを追加します。 [OK]をクリックします。マシンを再起動する必要があるかもしれません。

2)「WindowsServer 2003リソースキットツール」( http://www.Microsoft.com/en-us/download/confirmation.aspx?id=17657 )をダウンロードしてインストールします。コマンドプロンプトを開き、次のように入力します。

ntrights + r SeServiceLogonRight -u MyDomain\MyUser -m \\%COMPUTERNAME%

コンピューターを再起動して、サービスの開始を再試行してください。

ユーザーにサービスとしてログオンする権限が付与されたら、コマンドラインからサービスを作成して開始できます。

5
Marcos Arruda

おそらく問題は、パスワードを引用符で囲んだくないということです。ユーザー名についても同じことが言えます。

引用符がパスワードの一部であるかどうかはおそらくわかりません。

または、特定のアカウントに「サービスとしてログオン」権限が付与されていないことが原因である可能性があります。

通常、セキュリティイベントログを確認する必要があります。これにより、ログオンに失敗した理由がわかります。

1
Ben

これは私のために働いた:

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>"

つまり、要するに:stopサービスの前にconfigパスワードとstartは正常に機能します。

0
user3452718