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


11

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

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

ただし、ファイルの1つにエラーがあり、他のファイルの処理を妨げることがあります。通常、誰かが気付くまでに時間がかかり、いくつかのバックログがあります。

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

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

ここに画像の説明を入力してください

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

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

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

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

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

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

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

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

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

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


これは、いくつかの助けがあるかもしれないserverfault.com/questions/357424/... PowerShellが権限とない明白なものについて非常にうるさいようです
Drifter104


@ Drifter104:イベントGinaを使用してsubinaclではなく、サービスのアクセス許可を設定しましたが、とにかくSTOEパラメーターで試してみましたが、それでも同じ結果が表示されます。GPO設定を再確認し、[依存サービスの列挙]オプションも有効にしています。
VolrathTheFallen

@ MyronSemack-msemack記事に記載されているように、サービスのSDDL文字列を手動で設定しようとしましたが、GPOとsubinaclが最終的に同じことを行うと思います。
VolrathTheFallen

1
CmdLetのSet-Service $($service[1]) -status stopped -ComputerName . -Verbose ....代わりに試してStop-Serviceみませんか?この回答によると、Stop-ServiceとStart-Serviceは明らかにリモート対応ではありません。リモートコンピューターでGet-Service –ComputerNameを使用することはできません。エラーメッセージは、「リモート」localhost '。' (<==それはドットです。)
ジョン別名hot2use

回答:


3

別の質問へのanwserは同様に私の問題を解決しました。

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

  1. enable-psremoting 管理者のPowerShellプロンプトでサーバー上で
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI 管理者のPowerShellプロンプトでサーバー上で
  3. 完全な権限を持つサービスアカウント(またはセキュリティグループ)を追加しました
  4. sc sdshow scmanager サーバーの管理コマンドプロンプト
  5. SDDL出力をコピーします
  6. (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)SDDLのS:部分の前に追加します
  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. PowerShellスクリプトを変更して、Start-Service代わりにCmdLet を使用するようにしますSet-Service(Set-Serviceは機能しませんでした)。

単純なものが判明したように見えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.