9

我们有一些脚本使用 PowerShell 作为我们应用程序的一部分创建计划作业。最近在测试它们时,我注意到其中一些总是立即失败,并且没有产生任何输出(它们甚至没有出现在Get-Job列表中)。

经过多天的调整,我们设法将其隔离到任何设置为每周运行的作业中。下面是一个脚本,它创建了两个做同样事情的作业。当我们在我们的域上运行它,并提供域用户的凭据,然后强制这两个作业在任务计划程序 GUI 中运行(右键单击 -> 运行),每日运行正常(0x0 结果),每周运行失败(0x41306)。

注意:如果我不提供 -Credential 参数,这两项工作都可以正常工作。仅当任务是每周一次并且以此域用户身份运行时,作业才会失败。

我找不到关于为什么会发生这种情况的信息,也找不到任何原因它会在每周工作中表现不同。任务计划程序中的“历史记录”选项卡几乎没有有用的信息,只有“任务因用户请求而停止”和“任务终止”,两者都没有有用的信息:

任务计划程序终止了“\Microsoft\Windows\PowerShell\ScheduledJobs\Test1”任务的“{eabba479-f8fc-4f0e-bf5e-053dfbfe9f62}”实例。任务计划程序停止了任务 "\Microsoft\Windows\PowerShell\ScheduledJobs\Test1" 的实例 "{eabba479-f8fc-4f0e-bf5e-053dfbfe9f62}" 作为用户 "MyDomain\SomeUser" 的请求。

这是怎么回事?为什么每周任务的运行方式不同,我该如何解决这个问题?

这是 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)

编辑:按照 snover 的建议添加到 Connect:

https://connect.microsoft.com/PowerShell/feedback/details/776801/weekly-tasks-created-via-powershell-using-a-different-user-immediately-fail-with-error-0x41306

编辑:来自 Jeff Hicks 的一些附加信息

我使用您的代码在运行 PS v3 的 2008 R2 机器上创建了相同的作业。这两个作业都使用 Start-Job 从 PowerShell 运行良好。但是在 GUI 中,我在每周工作中遇到了同样的错误。

我在 Windows 8 上得到了相同的结果。有些东西告诉任务服务中止。我测试了其他一些设置,但它们没有效果。我查看了所有我能想到的日志,它们显示的只是作业开始、PowerShell 加载以及任务调度程序取消。

我之前将每周任务重置为今天运行,但它仍然失败。我还测试了一个每周执行的任务,而不是 PowerShell,它运行得很好。

我将每周工作更改为使用与当前用户相同的帐户,并且运行良好。将其更改回另一个帐户,它再次失败。我不知道触发器和帐户之间的相关性。

4

5 回答 5

1

创建计划任务时我遇到了类似的问题,但我不记得它是否基于日程安排。我发现切换到 gMSA 帐户来运行我们的计划任务?这使我们可以将任务设置为无论用户是否登录都运行。否则,您必须提供用户名和密码,并且无法选择用户是否登录。

于 2016-05-28T20:27:45.253 回答
0

默认作业选项可能会提供线索。有许多默认值可以阻止作业运行。其中一些可能特定于您的环境。更多信息在这里:http ://technet.microsoft.com/en-us/library/hh849674.aspx

如果不是这样,请告诉我。我想关注此主题并将此场景纳入该故障排除指南。

谢谢,June Blender (juneb) 微软高级编程作家

于 2013-01-17T18:52:32.780 回答
0

我终于找到了解决这种行为的方法。我安排了一个每周日执行的任务来运行一个 powershell 脚本。脚本本身运行良好。然后我尝试在任务计划程序中手动启动它。这以错误 41306 结束。在这里阅读您的评论后,我将日程安排更改为不是在下一个星期日首先运行,而是在最后一个星期日开始(所以开始日期是过去的)。之后,我可以立即启动它而没有任何问题。

于 2016-10-20T13:40:41.263 回答
-1

因此计划的作业在任务计划程序中运行,但并没有真正紧密的集成。当您注册计划作业时,会创建计划作业定义,并希望创建 Windows 计划任务选项。在 Windows 计划任务 1) 成功触发该计划作业之前,没有创建计划作业实例作业,并且 2 它运行得足够成功,它创建了实例。

我更希望如果计划作业失败,PowerShell 至少会查询计划任务引擎并找出实例已启动、失败、并收到错误或诸如此类的信息。

因此,基本上,当您注册它时,您会使用触发器注册它,这可能会发生也可能不会发生,并且在 PS 甚至运行之前可能会发生各种失败的事情。

例如,假设您将其指定为在某些凭据下运行,并且凭据有问题,或者在您注册它之后权限发生更改。当触发发生时,Windows 将无法启动计划任务,因此预定的作业代码不会告诉 PS 任何有关它的信息。

当我做一些演示时,发生了一个有趣的案例。在测试中,它会在我的笔记本电脑上注册它,并在 4 秒后触发,然后我可以看到作业实例,然后它会完成并且我可以获得结果。

但是,当我演示它时,它总是会失败。这是因为默认情况下,计划任务在使用电池运行时不会运行,而不是插入电源,并且在进行演示时,我会拿起我的笔记本电脑去向人们展示,而我没有插入电源。

这很可悲,因为从 PS 方面来看,似乎什么也没发生,就计划任务引擎而言,有一段历史,它试图运行但由于特定的错误代码和消息而失败。

如果您希望能够在下一个版本中看到具有失败状态和原因的作业,请在 connect 上投票支持我的错误

https://connect.microsoft.com/PowerShell/feedback/details/737587/psv3-scheduledjobs-if-a-trigger-fails-there-is-no-failed-instance-example-uses-multiple-triggers-to-做这个

于 2013-01-17T19:09:42.887 回答
-1

就我而言,当我查看任务的历史记录时,我发现在创建任务时,它正在使用 notepad.exe 来尝试执行(因为 notepad.exe 被设置为打开.ps1文件的默认值;因为它是编辑脚本的快速方法)。但这显然导致了一个问题。

为了解决这个问题,我右键单击我的一个PS1脚本并选择open with,然后选择默认值%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe(路径可能因阅读本文的每个人而异,所以我建议只调出 PowerShell 快捷方式的属性以获取您的特定路径) .

然后我再次尝试运行任务 - 成功!

于 2017-02-06T18:06:13.157 回答