web-dev-qa-db-ja.com

管理者以外のサービスアカウントとしてPowerShellを使用したサービスのスケジュールされた再起動

撃墜される前に、タスクをスケジュールする方法、Powershellでサービスを再起動する方法、または非管理者アカウントにサービスを再起動する権限を与える方法を知っています。それは問題ではありません。ただし、問題はこれら3つのタスクすべての組み合わせです。

ネットワークフォルダー上のファイルを処理する必要があるWindowsサービスがあります。したがって、実際には通常のドメインアカウントである「サービスアカウント」でログオンします。このドメインアカウントは管理者ではありませんが、上記のフォルダへのアクセス権があります。サービスは正常に実行され、その仕事を果たします。

ただし、ファイルの1つにエラーがあり、他のファイルを処理できない場合があります。通常、誰かが気づくまでにしばらく時間がかかり、バックログがいくつかあります。

そこで、Powershellで監視スクリプトを作成し、ネットワークフォルダーをポーリングしてこれらの誤ったファイルを探しました。それらが見つかった場合、ファイルは確認のために一時フォルダーに移動され、サービスを再起動する必要があります。

サービスを開始および停止するために、グループポリシーを介してサービスアカウントの権限を与えました。

enter image description here

サービスアカウントでサーバーにログオンすると、サービスMMCを使用して手動でサービスを再起動できます。また、PowerShellスクリプトを実行することもできます。これは、フォルダーがポーリングされ、ファイルを移動し、サービスを再起動することで、本来の機能を果たします。すごい!

次のフェーズでは、10分ごとに実行するスケジュールされたタスクを作成しました。タスクは、サービスと同じサービスアカウントを使用して、PowerShellスクリプトを実行します。 「最高の権限で実行する」のボックスがチェックされています。言ったように、powershellスクリプトはネットワークドライブにアクセスする必要があるため、ローカルサーバー管理者として実行することはできず、このような単純なタスクにドメイン管理者の資格情報を使用したくありません。 (私はできる限り最小限の特権の原則を実装しようとします。)

ローカルセキュリティポリシーMMCを使用して、サービスアカウントにローカルサーバーでの「バッチジョブとしてログオン」権限を付与しました。

今、私が理解できない部分について:スケジュールされた時間にスケジュールされたタスクが正常に完了し、PowerShellスクリプトが実行されています。スクリプトがフォルダをポーリングし、エラーファイルが移動されます。機能しないのは、サービスを再起動することだけです...?!繰り返しになりますが、同じユーザーが完全に機能したため、スクリプトを手動で実行しました。

イベントビューアにはあまり表示されませんが、スクリプトのログに次のエラーが表示されます。

TerminatingError(Stop-Service): "コンピューター '。'でサービスコントロールマネージャーを開けません。この操作には他の権限が必要な場合があります。"

サービスの再起動に使用するコマンドは次のとおりです。

Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])

(2008 R2ドメインでWindows Server 2012 R2およびPowershellバージョン4を使用しています。)

更新:私は両方ともsubinaclを使用してユーザーのサービス権限を設定しようとしました(説明 here )とSDDL文字列を手動で設定しました(記述されているように ここ )、私の制御フラグは次のようになります(A ;; CCLCSWRPWPDTLOCRRC ;;; S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)。また、GPOでサービスの特権をフルコントロールに設定してみました。これらのいずれも問題を解決しませんでした。権限のどこかにまだ見落としている問題があるはずです。サーバーのローカル管理者であるドメインアカウントでタスクをスケジュールすると、問題なく機能するからです。 。

11

別の質問への答え も私の問題を解決しました。

私が行った手順は次のとおりです。

  1. 管理PowerShellプロンプトのサーバー上の_enable-psremoting_
  2. 管理PowerShellプロンプトのサーバー上の_Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI_
  3. すべての権限を持つサービスアカウント(またはセキュリティグループ)を追加しました
  4. サーバー上の管理コマンドプロンプトでの_sc sdshow scmanager_
  5. SDDL出力をコピーする
  6. SDDLのS:部分の前に_(A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)_を追加します
  7. _sc sdset scmanager THE_MODIFIED_SDDL_鉱山は次のようになりました:sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
  8. _Start-Service_ではなく_Set-Service_ CmdLetを使用するようにPowerShellスクリプトを変更します(Set-Serviceが機能しませんでした)。

単純なものが判明したように見えますが、本来あるべきよりもずっと複雑です...

3