Schedule.Servicecomオブジェクトを介したRegisterTaskの呼び出しを使用してスケジュールされたタスクを作成するPowerShellスクリプトがあります。
基本的に:
$ts = new-object -com Schedule.Service
$ts.Connect()
$rootfolder = $ts.GetFolder("\")
$taskXml = Get-Content "Task.xml"
$rootfolder.RegisterTask("\Maintenance", $taskXml, 6, "LOCAL SERVICE", $null, 5)
これは私のローカルマシン(Windows 7、私はローカル管理者です)で正常に動作します
実行されるマシンでこれを試してみると、RegisterTask呼び出しがACCESS_DENIEDで失敗します。
ただし、管理者としてコマンドプロンプトを実行すると、powershell.exe -file myscript.sps1
正常に動作し、タスクを追加します。
実行しているユーザーに、%windir%および%windir%/ system32のTasksフォルダーに書き込む権限があることを確認しました
ユーザーは困惑しているAdministratorsグループに属していますが、スケジュールされたタスクを作成するためのアクセス許可をユーザーに与えるために他に何をする必要がありますか?それらをローカル管理者グループに追加するだけでは不十分のようです。
編集:スクリプトを実行するユーザーとしてサーバーにログオンしました。 xmlファイルをタスクスケジューラのUIアドインに手動で正常にインポートできます。
Powershell 4.0以降、ScheduledTask
モジュールを使用すると、com-objectを使用せずにスケジュールされたタスクを作成でき、読み取りと書き込みが簡単になります。
例:
$A = New-ScheduledTaskAction -Execute "Taskmgr.exe"
$T = New-ScheduledTaskTrigger -AtLogon
$P = New-ScheduledTaskPrincipal "Laptop\Administrator"
$S = New-ScheduledTaskSettingsSet
$D = New-ScheduledTask -Action $A -Principal $P -Trigger $T -Settings $S
Register-ScheduledTask T1 -InputObject $D
最初のコマンドは、New-ScheduledTaskAction
コマンドレットを使用して、変数$A
を実行可能ファイルtskmgr.exe
に割り当てます。
2番目のコマンドは、New-ScheduledTaskTrigger
コマンドレットを使用して、変数$T
を値AtLogonに割り当てます。
3番目のコマンドは、変数$P
をスケジュールされたタスクのプリンシパルContoso\Administrator
に割り当てます。
4番目のコマンドは、New-ScheduledTaskSettingsSet
コマンドレットを使用して、変数$S
をタスク設定オブジェクトに割り当てます。
5番目のコマンドは、新しいタスクを作成し、変数$D
をタスク定義に割り当てます。
6番目のコマンドは(仮想的に)後で実行されます。新しいスケジュールされたタスクを登録し、$D
変数を使用して定義します。
コードをAdministrator
として実行することを忘れないでください。 出典
最終的にあきらめ、登録タスクを使用してこれを行う方法を見つけることができませんでしたが、schtasks
を使用すると、アクセス拒否エラーなしでタスクのxmlファイルをインポートできました。 schtasksを使用して、タスクをリモートマシンにインポートすることもできます。