PowerShellスクリプトであるスケジュールされたタスクがあります。スクリプトは、統合されたセキュリティを介してアクセスが制御されるSQLデータベースに対していくつかのアクションを実行します。したがって、これらの各アクションは、適切なWindows AD資格情報の下で実行されているプロセスによって実行される必要があり、使用する必要のある資格情報のセットが複数あります。
詳細:
PowerShellタスクは、次のようにタスクスケジューラで呼び出されます。
_cmd.exe /C ""powershell.exe" -Noninteractive "C:\someDir\SomeScript.ps1" >"C:\logDir\SomeScript.log" 2>&1"
_
つまり、_cmd.exe
_は呼び出された_Program/script
_であり、行の残りの部分はAdd arguments (optional):
の部分です。 (当面の質問とは関係のない理由でこの方法を呼び出します。その一部は、開発したスクリプトライブラリへのロギングを設計した方法です。).
スケジュールされたタスク設定(General
)で、_Run whether user is logged in or not
_と_Run with highest privileges
_を選択します。タスクを実行しているユーザーIDは、_ad\admin1
_と呼び、ローカル管理者権限を持っています。
スクリプト_SomeScript.ps1
_内で、異なる資格情報の下で他のスクリプトを呼び出します。
_Start-Process $explicitPowershellExe -NonInteractive -Credential $credential -Wait -ArgumentList @( '-file', $scriptForSqlOperations )
_
資格情報_$credential
_は、_ad\admin1
_とは異なるユーザー用です。エラーは生成されませんが、この呼び出しはPowerShellの起動にサイレントに失敗します。 PowerShellの起動に失敗する唯一の手がかりは、「Windowsログ」=>システムのイベントです。
アプリケーションポップアップ:powershell.exe-アプリケーションエラー:アプリケーションを正しく起動できませんでした(0xc0000142)。 [OK]をクリックしてアプリケーションを閉じます。
スケジュールされたタスクの外部で実行する場合、スクリプトを問題なく実行できることに注意してください。ユーザー_SomeScript.ps1
_のログオンセッションでスクリプト_ad\admin1
_を実行すると、どのように実行しても成功します。たとえば、_cmd.exe
_コンソール(adminで実行)では、exact行を実行できます。
_cmd.exe /C ""powershell.exe" -Noninteractive "C:\someDir\SomeScript.ps1" >"C:\logDir\SomeScript.log" 2>&1"
_
成功するか、もっと簡単に実行できます
_powershell -Noninteractive "C:\someDir\SomeScript.ps1"
_
コマンドプロンプトで、すべてうまくいきます。したがって、問題は明らかに、TaskSchedulerが実行する_cmd.exe
_プロセスを設定する方法に問題があります。
誰かが問題が何であるか、そしてそれを回避する方法を知っていますか?スケジュールされたタスクでのなりすましに対するセキュリティ上の制限があるのではないかと思いますか????
ありがとう。
実行しようとしている各ユーザーが「バッチジョブとしてログオン」する権利を持っていることを確認してください。
gpedit.msc
を開き、Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment
に移動しますLog on as a batch job
右に追加します。gpupdate
を実行します