web-dev-qa-db-ja.com

スケジュールされたジョブを使用して、管理者権限で起動時にPowershellジョブを実行する

私の作業の一部を簡単にするために、私は以下を必要とするpowershellスクリプトを作成しました:

  1. 起動時に実行します。
  2. C:\ program filesフォルダーに書き込む必要があるため、管理者権限で実行します。

私はこのようなpowershellを使用してスタートアップサービスを作成しました:

function MakeStartupService
{
    Write-Host "Adding script as a startup service"
    $trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:15
    Try
    {
      Register-ScheduledJob -Trigger $trigger -FilePath "absolute_path" -Name "Job-name" -EA Stop
    }
    Catch [system.exception]
    {
        Write-Host "Looks like an existing startup service exists for the same. Overwriting existing job"
        Unregister-ScheduledJob "Job-name"
        Register-ScheduledJob -Trigger $trigger -FilePath "absolute_path" -Name "Job-name"
    }
}

ジョブはスタートアップサービスとして正常に登録され、タスクスケジューラ内に表示されます。 Start-Job -DefinitionName Job-nameを使用して、またはタスクスケジューラから右クリックして起動すると、正常に動作しますが、Windowsの起動時に起動しません。

現在、私は個人のWindows 10システムでこれをテストしており、別のWindows 10システムをチェックインしましたが、動作は名前のままでした。このジョブのタスクスケジューラウィンドウのスクリーンショットを添付しています。 enter image description here

この質問が繰り返し聞こえたり馬鹿げているように聞こえる場合は申し訳ありません(私はPowerShellの初心者です)。

前もって感謝します !!

20
Gagan93

これは、すでに使用しているコードで、私が使用しています。それがうまくいかない場合は、システムで何か他のことをしている必要があります。

function Invoke-PrepareScheduledTask
{
    $taskName = "UCM_MSSQL"
    $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
    if ($task -ne $null)
    {
        Unregister-ScheduledTask -TaskName $taskName -Confirm:$false 
    }

    # TODO: EDIT THIS STUFF AS NEEDED...
    $action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-File "C:\Invoke-MYSCRIPT.ps1"'
    $trigger = New-ScheduledTaskTrigger -AtStartup -RandomDelay 00:00:30
    $settings = New-ScheduledTaskSettingsSet -Compatibility Win8

    $principal = New-ScheduledTaskPrincipal -UserId SYSTEM -LogonType ServiceAccount -RunLevel Highest

    $definition = New-ScheduledTask -Action $action -Principal $principal -Trigger $trigger -Settings $settings -Description "Run $($taskName) at startup"

    Register-ScheduledTask -TaskName $taskName -InputObject $definition

    $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue

    # TODO: LOG AS NEEDED...
    if ($task -ne $null)
    {
        Write-Output "Created scheduled task: '$($task.ToString())'."
    }
    else
    {
        Write-Output "Created scheduled task: FAILED."
    }
}
13
Kory Gill

動作する場合は、スクリプトの問題ではありません。これをSYSTEMアカウントに割り当てるか、表示されているGaganアカウントの代わりに別のサービスアカウントを作成します。ローカルセキュリティポリシーで、サービスアカウントに「バッチジョブとして実行する権限」があることを確認してください。

1
Sencha718

タスクスケジューラでタスクの「最高の権限で実行」のチェックボックスをオンにして、再試行してください。現在、上のスクリーンショットではチェックされていません。

簡単に参照できるように、以下を赤で囲みました checkbox required checked

0
Aman Sharma

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

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

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

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

たぶん、完全に使用できますRegister-ScheduledTask でも私は〜がいい Register-ScheduledJobファイルではなくPowerShellスクリプトブロックを登録できるため。

$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

スケジュールされたタスクが実行されていない場合に確認できるMicrosoftのブログ記事は次のとおりです。 https://blogs.technet.Microsoft.com/askperf/2015/02/18/help-my-scheduled- task-does-not-run /

ここの他の回答でも述べたように、それはまた言う:

  • SYSTEMアカウントでスクリプトを実行してみてください
0
A189198