任务的安全上下文
任务在特定安全上下文中注册并运行。 用户可以创建成功注册、更新、删除或运行任务的应用程序,但在注册任务时,用户必须提供正确的凭据,并且应用程序必须在具有正确权限的进程中运行。
指定凭据
可以通过在 ITaskFolder::RegisterTask 或 ITaskFolder::RegisterTaskDefinition (TaskFolder.RegisterTask 或 Task 中指定凭据来指定任务的安全上下文 用于编写脚本的Folder.RegisterTaskDefinition) 方法,或者通过将主体分配给 ITaskDefinition 的 Principal 属性 (TaskDefinition.Principal 以编写脚本) 。 如果为任务定义创建了主体,然后使用 RegisterTaskDefinition 方法注册任务定义,方法参数中指定的不同凭据,那么 RegisterTaskDefinition 方法中指定的凭据将覆盖主体中的凭据。 如果使用 XML 为任务定义创建主体,然后使用 RegisterTask 方法注册该任务的 XML,方法参数中指定的不同凭据,那么 RegisterTask 方法中指定的凭据将覆盖主体中的凭据。
在注册任务或为任务指定原则时,可以指定用户帐户或组。 用户帐户或组的安全上下文用于任务的安全上下文。 在这些方法和属性中,还可以定义登录类型。 登录类型由 TASK_LOGON_TYPE 枚举中的常量之一定义。
仅当指定用户启用了“作为批处理登录”权限时,才启动使用 TASK_LOGON_PASSWORD 或 TASK_LOGON_S4U 标志注册的任务。 管理员和备份操作员组用户默认启用此权限。
调用 ITaskService::Connect (TaskService.Connect 以编写) 方法的脚本时,对任务计划程序服务的任何后续方法调用都将使用传递给 Connect 方法的凭据。 使用交互式登录类型注册任务时,请务必考虑这一点。 如果注册登录类型等于 TASK_LOGON_INTERACTIVE_TOKEN且该任务没有在任务定义的 Principal 属性中指定的凭据(在 RegisterTaskDefinition 的参数中指定)或在传递给 RegisterTask 的 XML 中指定的凭据时,将使用调用 Connect 方法的用户的凭据注册该任务。
用户帐户控制 (UAC) 任务的安全性
用户帐户控制 (UAC) 允许用户在不公开管理权限的情况下执行常规功能,例如运行程序以及保存和修改数据。 默认情况下,启用 UAC 时,任务以低级别特权运行。 任务可以通过为 IPrincipal 的 RunLevel 属性的 TASK_RUNLEVEL_TYPE 枚举 (Principal.RunLevel 设置特权级别来指定它们将使用提升的特权或低特权运行,以编写脚本) 。 RunLevel 属性的值确定任务操作的运行权限级别。 如果任务的操作必须具有提升的权限才能运行,则必须将 RunLevel 属性设置为 TASK_RUNLEVEL_HIGHEST。 如果使用管理员组注册任务,则如果要运行任务,还必须将 RunLevel 属性设置为 TASK_RUNLEVEL_HIGHEST 。 如果使用 Builtin\Administrator 帐户或本地系统或本地服务帐户注册任务,则将忽略 RunLevel 属性。 如果用户帐户控制 (UAC) 关闭,也会忽略属性值。 RunLevel 属性的值不会影响运行或删除任务所需的权限。
注意
将操作系统从 Windows XP 升级到 Windows Vista 后,使用 Windows XP 上的 Builtin\Administrator 帐户注册的任务会将 RunLevel 属性设置为 TASK_RUNLEVEL_LUA。 这可能会导致某些任务失败。 可以手动更新此属性,确保所有任务都将运行。
在低特权进程中,不能使用 RunLevel 属性等于 TASK_RUNLEVEL_HIGHEST 注册任务,但可以使用 RunLevel 属性等于 TASK_RUNLEVEL_LUA 注册任务。 任务操作将以低特权运行。 不允许将任务注册为内置/管理员、本地系统或组。
在提升的权限进程中,可以使用 RunLevel 属性注册等于 TASK_RUNLEVEL_HIGHEST 或 TASK_RUNLEVEL_LUA 的任务。 任务将使用 RunLevel 属性确定的权限级别运行,除非你使用的是管理员帐户,在这种情况下,任务使用提升的权限运行。
在提升的进程中,可以注册任务计划程序 1.0 任务。 任务计划程序服务会将任务的运行级别设置为 TASK_RUNLEVEL_HIGHEST并且任务将使用提升的权限运行。
在低特权进程中,还可以注册任务计划程序 1.0 任务。 任务计划程序服务会将任务的运行级别设置为TASK_RUNLEVEL_LUA,任务将以低特权运行。 如果此任务是从提升的进程更新的,则任务的运行级别将保持TASK_RUNLEVEL_LUA。
注册任务的安全性
从管理员组成员的帐户注册任务时,在以下情况下注册任务时只需指定密码:
- 如果将任务注册为在帐户的安全上下文或其他用户帐户下运行,并且使用 RegisterTask 或 RegisterTaskDefinition 方法中的 TASK_LOGON_PASSWORD 标志。
- 如果将任务注册为在不同用户帐户的安全上下文下运行,并且使用 RegisterTask 或 RegisterTaskDefinition 方法中的 TASK_LOGON_S4U 标志。
在 RegisterTask 或 RegisterTaskDefinition 方法中使用 TASK_LOGON_S4U 标志或 TASK_LOGON_PASSWORD 标志注册任务时,不能将用户组用作任务的安全上下文。
从不是管理员组成员的用户帐户注册任务时,如果将任务注册为在帐户的安全上下文下运行,并且使用 S4U 或交互式登录类型,则注册任务时无需指定密码。 否则,需要在注册任务时指定密码。 此外,不能使用本地服务帐户或使用任务安全上下文的组来注册任务。
读取、更新、删除和运行任务的安全性
默认情况下,创建任务的用户可以读取、更新、删除和运行任务。 用户必须对任务文件具有文件写入权限才能更新任务,对任务文件具有读取任务的文件读取权限,对任务文件具有删除权限以删除任务,对任务文件具有文件执行权限,才能使用 IRegisteredTask::Run 或 RunEx 方法 (RegisteredTask.Run 和 RunEx 编写脚本) 。 管理员组或 SYSTEM 帐户的成员可以读取、更新、删除和运行任何任务。 用户组、LocalService 帐户和 NetworkService 帐户的成员只能读取、更新、删除和运行他们创建的任务。 当更改任务文件的 DACL 时,此默认行为将更改,在这种情况下,DACL 定义哪些用户具有文件写入、读取、执行和删除权限。 若要设置任务文件的权限,请使用 IRegisteredTask.SetSecurityDescriptor 方法 (RegisteredTask.SetSecurityDescriptor 编写脚本) ,或者在使用 RegisterTask 或 RegisterTaskDefinition 方法注册任务时设置安全描述符。
如果任务更新需要更改任务的 DACL,用户还必须具有写入/写入权限才能更新任务。
相关主题