Windowsタスクスケジューラの監視を導入しようとしています。次のコマンドを実行するPowershellスクリプトがあります。
$serverName = hostname
$schedule = new-object -com("Schedule.Service")
$schedule.connect($serverName)
$tasks = $schedule.getfolder("\").gettasks(0)
$tasks |select name, lasttaskresult, lastruntime
これにより、実行されているサーバーでスケジュールされているタスクのリスト、最後のタスクの結果、および最後の実行時間が返されます。これの目的は、アラートに使用できる監視ソリューション(Geneos)にデータセットを返すことです。
Win2008の大規模な資産があるため、スクリプトを一元化して、Geneosプローブのいずれかがそれを呼び出し、ホストのデータセットを返すことができるようにする必要があります。これを行うために、PowerShellを.batファイルでラップしました。これは次のことを行います。
\\fileserverhk\psexec.exe -accepteula -u admin -p "pwd" powershell.exe cpi \\fileserverhk\scripts\TaskSchedulerMonitor.ps1 -Destination C:\Monitor\TaskSchedulerMonitor.ps1
\\fileserverhk\psexec.exe -accepteula -u admin -p "pwd" powershell.exe -ExecutionPolicy Bypass -File C:\Monitor\TaskSchedulerMonitor.ps1
最初のステップでは、.ps1ファイルをローカルにコピーして、UNCパスを信頼しないPowershellを回避し、2番目のステップでスクリプトを実行します。
テストサーバーから.batファイルを手動で実行すると、正常に実行されます(これは管理者アカウントでログインしています)。ただし、Geneos(SYSTEMアカウントで実行)を介して.batファイルを起動すると、次のようになります。
Access is denied.
PsExec could not start powershell.exe:
つまり、基本的に私の質問は、PsExecがSYSTEMアカウントで実行されているときに、ユーザーを切り替えるにはどうすればよいですか?PsExecには別のアカウントのクレデンシャルが設定されていますが、システムで実行すると変更できないことが明らかにあります。
-hスイッチを使用して実行しようと読みましたが、次のエラーが発生します。
The handle is invalid.
Connecting to local system...
Starting PsExec service on local system...
Connecting with PsExec service on <server>...
Starting powershell.exe on <server>...
Error communicating with PsExec service on <server>:
上記のエラーに加えて、PSExecとPowerShellプロセスがリモートマシンでハングすることになります。興味深いのは、PSExecとPSEXEC.SVCがSYSTEMで実行され、PowerShellがadminで実行されているのを確認できることです。ほぼそこにありますが、何かが正しくありません。