Powershell スクリプトのスケジュールされたタスク

Powershell スクリプトのスケジュールされたタスク

そこで、PowerShell スクリプトをスケジュールに従って実行しようとしています。毎朝 6 時に、1 日中 1 時間ごとに繰り返します。スクリプト自体は次のとおりです。

Get-Content C:\Users\administrator\Desktop\users.txt | ForEach-Object {
    Set-AdUser -Identity $_ -LogOnWorkstations $null
}

現在、スクリプトは自分で実行すると問題なく動作します。しかし、スクリプトは実行がスケジュールされているときに適切に実行されないようです。実行ポリシーが、スクリプトを実行する前にスクリプトを実行しても安全かどうかを尋ね続けているのではないかと思います。これがスクリプトが単独で起動できない理由かもしれないと同意する方がいらっしゃいましたら、この障壁を回避する解決策を教えていただけませんか?

答え1

スケジュールされたタスクはどこにありますか? GPO 上ですか、それともローカル マシン上ですか? スクリプトと、スクリプトを実行するマシンは同じネットワーク内にありますか?

次のようにスケジュールを設定してみてください (まだ設定していない場合)。

Programm/Script: PowerShell.exe

Arguments: -ExecutionPolicy Bypass -Command "& 'FilePathToScript.ps1'"

編集: また、スクリプトを実行するワークステーションに AD-PS モジュールをインストールする必要があるかどうかはよくわかりません。コマンドがSet-ADUser見つからない可能性があるからです。

答え2

実行ポリシーは簡単に確認できます。通常どおりログオンしているときにスクリプトとして実行できますか? 実行できない場合は、管理 PowerShell セッションから 'set-execution policy remotesigned' を実行すると、サーバーに対してグローバルに設定されます。

スケジュールされたタスクを実行するユーザーには、タスクが実行されているマシンに対する「バッチとしてログオン」権限が必要です。これは AD モジュールであるため、ドメイン コントローラーで実行されているものと想定されます。その場合、既定のドメイン コントローラー GPO を修正して、ユーザーに「バッチとしてログオン」権限を割り当てる必要があります。RSAT を備えたワークステーションまたはメンバー サーバーでタスクが実行されている場合は、ローカル セキュリティ ポリシーを使用してこの権限を割り当てる必要があります (SecPol.MSC)。

スクリプトを実行するユーザーは、ユーザー オブジェクトを修正できるレベルで Active Directory にアクセスできる必要があります。通常、ドメイン コントローラーにログオンしている場合は、この権限が付与されるドメイン管理者がいますが、サービス アカウントを作成した場合は、適切な権限がない可能性があります。必要な権限レベルを調査し、これを AD ドメインの関連領域に適用する必要があります。この点には注意してください。

バッチとしてログオンだったと思います。何度か引っかかったことがあり、いつ停止されるのか分かりません。

さらに詳しく調査する必要がある場合は、スケジュールされたタスクの履歴タブやイベント ビューアーが役立ちます。

答え3

実行ポリシーはマシン全体に適用されます。対話的に動作する場合、スケジュールされたタスクとして実行しても問題が発生する可能性は低いと思われます。

ここで欠けているのは情報です。2 つのコマンドとログなしでは、情報を取得できません。また、Active Directory モジュールをロードしていないため、いくつかのことが説明できるかもしれません。

PowerShell スクリプトをスケジュールされたタスクとして起動し、出力をログに記録する方法の例を次に示します。

Program/Script: PowerShell  
Arguments:  
-NonInteractive -WindowStyle minimized -c "powershell -c C:\Apps\AppName\SomeScript.ps1 -verbose > C:\Apps\AppName\Logs\SomeScript.log 2>&1"  

Active Directory モジュールをロードする例を次に示します。

$startTime = Get-Date
$logDateFormat = "yyyy-MM-dd HH:mm:ss"
[console]::WriteLine("{0} Loading Active Directory Module", [datetime]::Now.ToString($logDateFormat))
import-module ActiveDirectory  

Get-Content C:\Users\administrator\Desktop\users.txt | ForEach-Object {  
    [console]::WriteLine("{0} Clearing workstations for user: {1}", [datetime]::Now.ToString($logDateFormat), $_)
    Set-AdUser -Identity $_ -LogOnWorkstations $null
}

$endTime = Get-Date
[console]::WriteLine("{0} Finished.  Time Required: {1}", [datetime]::Now.ToString($logDateFormat), $endTime.Subtract($startTime).ToString())

答え4

Powershell.exe プログラム/スクリプトの引数とパスは次のようになります

 -ExecutionPolicy Bypass -File "C:\alert.ps1"

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

関連情報