如何以 Windows 本地服务帐户身份运行执行 PowerShell 脚本的 Windows 任务

如何以 Windows 本地服务帐户身份运行执行 PowerShell 脚本的 Windows 任务

在 2008 R2 服务器上,我有一个执行 PowerShell 脚本的 Windows 任务。在任务计划程序中将其设置为以管理员帐户执行时,它可以正常工作,但我想将其设置为以 Windows 本地服务帐户执行,因为我读到这被认为是一种安全最佳实践,因为本地服务的权限非常有限。

使用本地服务帐户时,根据任务计划程序中的历史记录,任务本身似乎成功运行了 PowerShell 脚本。但是 PowerShell 脚本并没有按照设计输出文本文件,这让我相信也许 PowerShell.exe 本身运行了,但脚本由于某种原因被阻止了。

在任务计划程序中,我将任务设置为“以最高权限运行”,因此我认为这就是让它成功运行所需要的全部内容……

如何让此 PowerShell 任务成功运行?或者我应该创建一个 Windows 域服务帐户来运行此任务?

答案1

我更喜欢使用注册-ScheduledJob因为它允许我使用 PowerShell 脚本块而不是脚本文件。但您可以自由地只使用注册ScheduledTask那就更加容易了。

在下面的脚本中我使用注册-ScheduledJob创建一个 PowerShell 作业。
然后我使用设置计划任务将启动帐户更改为 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

相关内容