【问题标题】:PowerShell: Update Scheduled Task username and password?PowerShell:更新计划任务用户名和密码?
【发布时间】:2012-02-28 18:59:15
【问题描述】:

我正在寻找一种方法来更新机器上现有计划任务的凭据。

  • Schtasks 不适用于 AT 创建的计划任务
  • Win32_ScheduledJob 仅适用于 AT 创建的作业
  • Schedule.Service COM 对象 - 不确定

看来我可以使用 RegisterTask 和 RegisterTaskDefinition 来创建计划任务,但我不清楚是否可以使用这些方法更新现有凭据。请指教。谢谢。

【问题讨论】:

  • 对于任务调度程序 1.0 还是 2.0?
  • 你为什么还在使用 AT 风格的任务?这里有操作系统限制吗?
  • 我并不是特别使用AT来安排任务,但我不能保证第三方供应商不会。关键是使用一种最佳方法来获取所有可能的计划任务。
  • 以及 vista 及其他任何任务调度程序。

标签: powershell scheduled-tasks


【解决方案1】:

我建议查看托管的 TaskScheduler API,它是 TaskScheduler COM API 的 .NET 包装器。这是 CodePlex 上的一个开源项目。

http://taskscheduler.codeplex.com/

项目作者对更新密码有这样的说法:

如果您尝试使用 当前用户并且您只希望它在该用户登录时运行, 您需要调用 RegisterTaskDefinition 方法,如末尾 带有 InteractiveToken 参数的 Complex 示例。如果你需要 作为另一个特定用户创建,然后使用相同的方法,但是 提供用户名、密码,并将 TaskLogonType 设置为 InteractiveTokenOrPassword 或密码。有一些触发因素 特定于用户,例如 LogonTrigger 您还可以 提供用户凭据。

RegisterTaskDefinition 的适当重载在 TaskFolder.cs 中定义。

http://taskscheduler.codeplex.com/SourceControl/changeset/view/75611#19440

public Task RegisterTaskDefinition(string Path, TaskDefinition definition
   , TaskCreation createType, string UserId, string password = null
   , TaskLogonType LogonType = TaskLogonType.S4U, string sddl = null)

【讨论】:

  • 我真的不想使用第三方代码;特别是因为它不是 powershell,但是您从项目中发布的块引用似乎躲避了我可能需要使用的 Schedule.Service COM 对象的片段。
  • 您可以轻松地将这个 .NET 库加载到 PowerShell 中。但是,是的,正如您所提到的,您可能可以从该项目的源代码中找出 COM 方法。
  • 好吧,我不能在本地使用代码,因为powershell可以调用其他自然编写的语言。问题是我试图尽可能多地远离依赖项,即使 COM 对象确实是一个依赖项,它也随操作系统一起提供,而不必为 PoSh 文件提供第三方代码。
【解决方案2】:

我最近提出了这个任务。我知道这篇文章很旧,但想把这个脚本放在某个地方,让人们找到希望能帮助他们。这是纯电源外壳,因此无需额外设置。我曾尝试使用 Set-ScheduledTask,但在设置域用户时遇到问题。我最终改用了 schtasks。您可能需要以管理员身份运行此脚本。

$domainUsername = "domain\user"
$password= "somePassword"
 
$tasks = Get-ScheduledTask | Where-Object { $_.Principal.UserId -eq $domainUsername }

foreach ($task in $tasks) {
    $myTask = $task.TaskPath+$task.TaskName
    echo changing $myTask
    schtasks /change /s $env:COMPUTERNAME /tn $myTask  /ru $domainUsername /rp $password
}

这是另一个如何推送到多个服务器的示例。 sessionCredentials 是用于连接到服务器的凭据,域用户和新密码是要设置给任务的名称和密码

$sessionCredentials = Get-Credential

$taskDomainUsername = "DOMAIN\SOMEACCOUNT"
$NewPassword = "somePassword"


$computerNames = @(
    "someNameServer1",
    "someNameServer2"
)

$serverSession = New-CimSession -ComputerName $computerNames -Credential $sessionCredentials

$tasks = Get-ScheduledTask -CimSession $serverSession | Where-Object { $_.Principal.UserId -eq $taskDomainUsername }

foreach($task in $tasks) {
    echo updating $task
    $specificSession = $serverSession | Where-Object { $_.ComputerName -eq $task.PSComputerName}
    $taskFullName = $task.TaskPath+$task.TaskName
    Set-ScheduledTask -CimSession $specificSession -TaskName $taskFullName -User $taskDomainUsername -Password $NewPassword

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2015-12-20
    • 2017-02-18
    • 2023-03-27
    • 2020-12-07
    • 2020-01-12
    • 1970-01-01
    相关资源
    最近更新 更多