我们有一些脚本,它们使用 PowerShell 创建计划作业作为我们应用程序的一部分。最近测试它们时,我注意到其中一些总是立即失败,并且从未产生任何输出(它们甚至没有出现在列表中Get-Job
)。
经过多日的调整,我们设法将其隔离到设置为每周运行的任何作业。下面是一个脚本,它创建了两个执行完全相同操作的作业。当我们在域上运行此脚本并提供域用户的凭据,然后在任务计划程序 GUI 中强制运行这两个作业(右键单击 -> 运行),每日作业运行正常(结果为 0x0),每周作业失败(0x41306)。
注意:如果我不提供 -Credential 参数,两个作业都可以正常工作。作业只会失败如果任务是每周执行一次并且以此域用户身份运行。
我找不到有关为什么会发生这种情况的信息,也想不出它对每周工作表现不同的任何原因。任务计划程序中的“历史记录”选项卡几乎没有有用的信息,只有“由于用户请求而停止任务”和“任务终止”,这两者都没有有用的信息:
任务计划程序已终止“\Microsoft\Windows\PowerShell\ScheduledJobs\Test1”任务的“{eabba479-f8fc-4f0e-bf5e-053dfbfe9f62}”实例。任务计划程序已根据用户“MyDomain\SomeUser”的请求停止任务“\Microsoft\Windows\PowerShell\ScheduledJobs\Test1”的“{eabba479-f8fc-4f0e-bf5e-053dfbfe9f62}”实例。
这是怎么回事?为什么每周任务的运行方式不同?我该如何诊断这个问题?
这是 Windows Server 2008 R2 上的 PowerShell v3。我无法在本地重现此问题,但我没有像生产域中那样设置用户(我正在处理此问题,但我想尽快发布此问题,希望有人知道发生了什么!)。
Import-Module PSScheduledJob
$Action =
{
"Executing job!"
}
$cred = Get-Credential "MyDomain\SomeUser"
# Remove previous versions (to allow re-running this script)
Get-ScheduledJob Test1 | Unregister-ScheduledJob
Get-ScheduledJob Test2 | Unregister-ScheduledJob
# Create two identical jobs, with different triggers
Register-ScheduledJob "Test1" -ScriptBlock $Action -Credential $cred -Trigger (New-JobTrigger -Weekly -At 1:25am -DaysOfWeek Sunday)
Register-ScheduledJob "Test2" -ScriptBlock $Action -Credential $cred -Trigger (New-JobTrigger -Daily -At 1:25am)
答案1
我必须自己弄清楚这一点,所以这就是我发现的。
在 poweshell 文档中我发现了以下内容:
Get-ScheduledJob 仅获取当前用户使用 Register-ScheduledJob cmdlet 创建的计划作业。
http://technet.microsoft.com/en-us/library/hh849784.aspx
这样做的影响是,如果您使用用户“A”创建作业,然后运行脚本尝试使用用户“B”访问它们,则会抛出一个错误,指出找不到该作业。
答案2
由于相同的脚本添加了两个计划作业,因此会话/当前用户凭据存在差异的可能性较小。
我会交换删除和添加每个作业的顺序,先处理每日作业,然后再处理每周作业。如果这没有任何变化,那么可能是作业参数而不是调度程序状态引擎中的某些东西未初始化。