web-dev-qa-db-ja.com

PowerShellとcomschedule.serviceオブジェクトを使用してスケジュールされたタスクを作成するときにアクセスが拒否されました

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アドインに手動で正常にインポートできます。

1
Matt

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として実行することを忘れないでください。 出典

1
Smeerpijp

最終的にあきらめ、登録タスクを使用してこれを行う方法を見つけることができませんでしたが、schtasksを使用すると、アクセス拒否エラーなしでタスクのxmlファイルをインポートできました。 schtasksを使用して、タスクをリモートマシンにインポートすることもできます。

0
Matt