PowerShell创建计划任务添加-RunLevel Highest参数报访问被拒绝求助
问题根因
创建配置了「最高权限运行」属性的计划任务时,执行创建操作的PowerShell进程本身必须先以管理员身份启动,即便你输入的运行任务的凭证是管理员账户,当前执行脚本的会话没有管理员权限也会触发「访问被拒绝」报错。你手动修改任务时启动的任务计划程序默认携带了管理员权限,因此可以设置成功。
解决方案
步骤1:启动带管理员权限的PowerShell
右键点击Windows开始菜单中的「PowerShell」(或「终端」),选择「以管理员身份运行」,再执行你的脚本即可。
步骤2:调整脚本代码
只需要在原代码的Register-ScheduledTask命令中添加-RunLevel Highest参数即可,修改后完整代码如下:
$jobname = "Recurring PowerShell Task 2" $script = '-File "C:\Users\Paul\Documents\RSYNC\Get-LatestAppLog.ps1" -name ' + '10001.QvdDeletionTest' $action = New-ScheduledTaskAction –Execute "powershell.exe" -Argument "$script" $duration = ([timeSpan]::maxvalue) $repeat = (New-TimeSpan -hours 3) $trigger =New-ScheduledTaskTrigger -Daily -At 2:00pm $msg = "Enter the username and password that will run the task"; $credential = $Host.UI.PromptForCredential("Task username and password",$msg,"$env:userdomain\$env:username",$env:userdomain) $username = $credential.UserName $password = $credential.GetNetworkCredential().Password $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable -DontStopOnIdleEnd # 新增-RunLevel Highest参数即可 Register-ScheduledTask -TaskName $jobname -Action $action -Trigger $trigger -User $username -Password $password -Settings $settings -RunLevel Highest
可选:给脚本添加自动提权逻辑
如果不想每次手动启动管理员PowerShell,可以在脚本最开头加入以下代码,脚本运行时会自动检测权限,不足时自动重启为管理员身份:
# 自检管理员权限,不足则自动提权 if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs exit }
注意事项
- 不要完全禁用系统UAC(用户账户控制),否则
-RunLevel Highest配置可能无法正常生效,保持默认UAC等级即可。 - 如果你创建的任务是给内置
Administrator账户运行的,部分Windows版本需要先开启该账户的启用状态才能正常配置。
内容的提问来源于stack exchange,提问作者Paul van Schalkwyk
相关产品推荐
相关产品推荐

