Назад | Перейти на главную страницу

Как запустить задачу Windows, которая выполняет сценарий PowerShell от имени учетной записи локальной службы Windows

На сервере 2008 R2 у меня есть задача Windows, которая выполняет сценарий PowerShell. Он отлично работает, если в планировщике заданий задано выполнение как учетная запись администратора, но я бы хотел настроить его для выполнения как учетная запись локальной службы Windows, поскольку я читал, что это считается лучшей практикой безопасности, поскольку локальная служба очень ограничена привилегии.

При использовании учетной записи локальной службы сама задача запускает сценарий PowerShell успешно в соответствии с журналом истории в планировщике задач. Но сценарий PowerShell не выводит текстовый файл, как это было задумано, что наводит меня на мысль, что, возможно, сам PowerShell.exe был запущен, но сценарий был заблокирован по какой-то причине.

В планировщике задач у меня есть задача «Запускать с наивысшими привилегиями», поэтому я подумал, что это все, что мне нужно для ее успешного запуска ...

Как я могу добиться успешного выполнения этой задачи PowerShell? Или я должен просто создать учетную запись службы домена Windows для выполнения этой задачи?

Я предпочитаю использовать Регистрация - Запланированная работа поскольку это позволяет мне использовать блоки сценариев PowerShell вместо файлов сценариев. Но вы можете использовать только Регистрация-ScheduledTask это будет еще проще.

В приведенном ниже скрипте я использую Регистрация - Запланированная работа для создания задания PowerShell.
Тогда я использую Set-ScheduledTask чтобы изменить стартовую учетную запись на LocalSystem или любую другую встроенную учетную запись.

Вы можете запускать сценарий несколько раз. Но запустите его под учетной записью администратора.

Видеть $accountId = "NT AUTHORITY\LOCAL SERVICE"; ниже.
Также обратите внимание на -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