web-dev-qa-db-ja.com

Powershell-ローカルシステム/サービスとして実行するスケジュールされたタスクを作成する

ローカルシステムまたはローカルサービスとして実行されるPowerShellを使用してスケジュールされたタスクを作成する方法を教えてもらえますか?

ITaskFolder.RegisterTaskDefinition()の呼び出しを除いて、すべてがうまく機能します。

$ null、つまり「」を渡すと、ユーザー名またはパスワードが無効であるという呼び出し爆弾が発生します。何かご意見は"

$ Rootfolder.RegisterTaskDefinition( "Test"、$ Taskdef、6、 "LOCAL SERVICE"、 ""、3)

14
devlife

ユーザー名として「ntauthority\localservice」を使用する必要があると思います。

親切、

ダン

3
Daniel Elliott

このコードスニペットは、 PowerShellPack のタスクスケジューラモジュールを使用して、タスクをSYSTEMとしてすぐに実行するようにスケジュールします。

New-Task |
    ForEach-Object {
        $_.Principal.Id = "NTAuthority\SYSTEM"
        $_.Principal.RunLevel = 1
        $_
    } |
    Add-TaskAction -Script {
        "SystemTask" > C:\myTest.txt
    } |
    Add-TaskTrigger -OnRegistration |
    Register-ScheduledTask SystemTask
5

スクリプトファイルの代わりにPowerShellスクリプトブロックを使用できるため、Register-ScheduledJobを使用することをお勧めします。

最初にRegister-ScheduledJobを使用してPowerShellジョブを作成します。

次に、Set-ScheduledTaskを使用して、スタートアップアカウントをLocalSystemまたはその他の組み込みアカウントに変更します。

次のPSコードの例は、すべてを説明しています。動作を確認したい場合は、管理者アカウントで複数回実行できます。

-RunElevatedにも注意してください

$ErrorActionPreference = 'Stop'


Clear-Host

$taskName = "it3xl_dummy_PowerShell_job"
# Unregister-ScheduledJob it3xl_dummy_PowerShell_job -Confirm:$false

$task = Get-ScheduledJob -Name $taskName  -ErrorAction SilentlyContinue
if ($task -ne $null)
{
    Unregister-ScheduledJob $task  -Confirm:$false
    Write-Host "Old $taskName job has been unregistered"; Write-Host;
}


$trigger = New-JobTrigger -AtStartup;

$options = New-ScheduledJobOption -StartIfOnBattery  -RunElevated;

Write-Host "Registering new $taskName job";
Register-ScheduledJob -Name $taskName  -Trigger $trigger  -ScheduledJobOption $options `
    -ScriptBlock {
    Write-Host In our PowerShell job we say - oppa!;
}


$accountId = "NT AUTHORITY\SYSTEM";
#$accountId = "NT AUTHORITY\LOCAL SERVICE";
$principal = New-ScheduledTaskPrincipal -UserID $accountId `
    -LogonType ServiceAccount  -RunLevel Highest;

$psSobsSchedulerPath = "\Microsoft\Windows\PowerShell\ScheduledJobs";
$someResult = Set-ScheduledTask -TaskPath $psSobsSchedulerPath `
    -TaskName $taskName  -Principal $principal


Write-Host;
Write-Host "Let's show proofs that our PowerShell job will be running under the LocalSytem account"
$task = Get-ScheduledTask -TaskName $taskName
$task.Principal

Write-Host "Let's start $taskName"
Start-Job -DefinitionName $taskName | Format-Table

Write-Host "Let's proof that our PowerShell job was ran"
Start-Sleep -Seconds 3
Receive-Job -Name $taskName
0
it3xl