PowerShell创建的用户登录计划任务如何允许用户自行卸载
问题根源
你创建计划任务时的权限配置存在冲突:
New-ScheduledTaskPrincipal指定任务以创建任务的管理员/SYSTEM身份运行Register-ScheduledTask又通过-User $userName指定任务关联到目标普通用户
最终该计划任务的所有者为管理员身份,普通登录用户没有权限删除其他身份创建的系统计划任务。同时该配置会导致任务以管理员身份运行,写入的目标用户下载目录的文件所有者为管理员,目标用户本身无法正常访问。
解决方案
推荐两种方案,按需选择即可:
方案1:使用计划任务自带的「执行后自动删除」配置(最优,无需手动卸载)
完全不需要在业务脚本里调用Unregister-ScheduledTask,直接通过计划任务的原生配置实现执行一次后自动删除,从根源避免权限问题,修改代码如下:
- 修改任务设置项,开启过期后自动删除
- 修正任务运行主体配置,避免冲突
- 移除业务脚本里的卸载代码
完整修改后的代码:
Clear-Host; $currentIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent(); $currentPrincipal = New-Object System.Security.Principal.WindowsPrincipal($currentIdentity); $userName = 'JDOE'; Set-Content ` -Path "C:\$userName-FirstLogOn.ps1" ` -Value " New-Item -Path 'C:\Users\$userName\Downloads\FirstLoggedOn.txt' -Force -Confirm:`$false > `$null; 'TEST' | Out-File -FilePath 'C:\Users\$userName\Downloads\FirstLoggedOn.txt'; # 移除原来的Unregister代码,任务会自动删除 Read-Host; ".Trim(); $action = New-ScheduledTaskAction ` -Execute 'PowerShell.exe' ` -Argument "-File C:\$userName-FirstLogOn.ps1"; # 修正:指定任务以目标用户身份运行,需要管理员权限的话可改回-RunLevel Highest $principal = New-ScheduledTaskPrincipal ` -UserId $userName ` -RunLevel Limited; # 新增:配置任务触发后立即删除 $settings = New-ScheduledTaskSettingsSet -DeleteExpiredTaskAfter 00:00:00; $trigger = New-ScheduledTaskTrigger ` -AtLogOn ` -User $userName; # 配置触发器过期时间,配合自动删除规则生效 $trigger.EndBoundary = (Get-Date).AddYears(1).ToString("yyyy-MM-dd'T'HH:mm:ss.fffZ") $task = New-ScheduledTask ` -Action $action ` -Principal $principal ` -Trigger $trigger ` -Settings $settings; $task.Author = $userName; # 去掉重复的-User参数,Principal中已指定运行用户 Register-ScheduledTask ` -TaskName "$userName - First Log On" ` -InputObject $task > $null;
方案2:给目标用户授予任务的完全控制权限(需要保留手动卸载逻辑的场景)
如果一定要在业务脚本里手动执行卸载操作,可以在创建任务时直接给目标用户分配该任务的完全控制权限,在Register-ScheduledTask之前添加如下代码即可:
# 为目标用户生成任务完全控制权限的SDDL $userSid = (New-Object System.Security.Principal.NTAccount($userName)).Translate([System.Security.Principal.SecurityIdentifier]).Value $task.SecurityDescriptor = "D:(A;;FA;;;SY)(A;;FA;;;BA)(A;;FA;;;$userSid)"
配置后目标用户运行任务时就拥有足够权限卸载该任务。
两种方案都可以解决权限不足的问题,方案1更简洁可靠,无需处理额外权限配置,也不会留下冗余代码。
内容的提问来源于stack exchange,提问作者Gup3rSuR4c
相关产品推荐
相关产品推荐

