我在 Windows 任务计划程序中设置了一个自定义计划任务,但不知何故,它的访问控制权限被破坏了。即使我以管理员身份登录,我也无法更改运行任务的用户帐户,也无法删除或禁用任务。相反,我收到“权限被拒绝”错误。
该机器正在运行 Windows 10 Pro 1803。它是一台工作组机器,不在域中。
这个任务是我自己创建的(它每天只启动两次 PowerShell 脚本,没什么特别的),所以它不应该受到任何防篡改机制的约束,例如与 Windows 更新相关的任务。
我尝试了以下方法:
- 从“开始”菜单启动“计划任务”,方法是右键单击并选择“以管理员身份运行”。我得到
The user account does not have permission to delete this task.
Unregister-ScheduledTask -TaskName 'My custom task'
从管理员级别的 PowerShell 提示符运行 PowerShell 命令 来删除任务。这将返回Access is denied
。- 使用启动 MMC 管理单元
.\psexec -i -d -s mmc taskschd.msc
。如果我理解正确的话,这应该是以 SYSTEM 身份启动任务计划程序控制台管理单元。我也无法使用此方法删除任务 - 我收到的错误消息与使用普通用户帐户运行时以管理员身份启动管理单元时收到的错误消息相同。
有人能指点一下为什么会发生这种情况,以及我该如何解决吗?
任务定义存储在哪里?文件系统、注册表还是其他地方?看来我可能需要修复一些损坏的安全信息。
答案1
所有任务定义均存储在
- 注册表:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\*
和
- 文件系统:
C:\Windows\System32\Tasks\*
安全描述符既存在于文件系统中的文件中,也存储在每个任务的注册表中:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\<TaskName>\SD
该注册表值是二进制形式,似乎没有合适的 UI。
您可以通过 Powershell 和任务计划程序 API 检索它(https://docs.microsoft.com/en-us/windows/win32/api/_taskschd/index):
$ts = New-Object -ComObject "Schedule.Service" $ts.Connect("localhost") $task = $ts.GetFolder("").GetTask("<TaskName>") Write-Host $task.GetSecurityDescriptor(0xF)
- 此方法返回安全描述符SDDL 格式
但:
- 我遇到了同样的问题,似乎问题与任务权限没有直接关系,而是与 Windows 10 升级期间创建的任务上的硬链接有关
- 检查文件夹
C:\$WINDOWS.~BT\NewOS\Windows\System32\Tasks_Migrated\
是否包含指向任务文件的硬链接C:\Windows\System32\Tasks
- 我已删除所有硬链接
C:\$WINDOWS.~BT\NewOS\Windows\System32\Tasks_Migrated\
,之后Unregister-ScheduledTask
一切如预期。
- 检查文件夹
更新:
我终于调查出了 Windows 10 中“损坏”任务权限的问题。它与权限根本没有任何共同之处,看起来像是安全补丁的意外结果。
2019 年 11 月 6 日 微软发布了针对CVE-2019-1069。此补丁修复了任务计划程序的一个漏洞,攻击者需要创建与某些任务相关的文件的硬链接。
- 如果安装了此修补程序,您将无法使用任务计划程序 API(schtasks、powershell -ScheduledTask、COM“Schedule.Service”)更改/启用/禁用/删除任务,如果 C:\Windows\System32\Tasks\ 中的关联任务文件具有任何硬链接。
- 安装期间的 Windows 功能更新执行“任务迁移”过程并为文件夹 C:\$WINDOWS.~BT\NewOS\Windows\System32\Tasks_Migrated\ 中的所有任务创建硬链接,这可能是无法删除任务的原因。
- 删除所有硬链接即可解决问题。