在 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