为什么使用其他用户通过PowerShell创建的每周任务失败,错误为0x41306

时间:2013-01-17 12:18:26

标签: powershell scheduled-tasks windows-server-2008-r2 powershell-v3.0

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

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

注意:如果我不提供-Credential参数,则两个作业都可以正常工作。如果任务是每周一次,并以该域用户身份运行,则作业仅失败。

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

  

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

这是怎么回事?为什么每周任务的运行方式不同,我怎样才能解决这个问题呢?

这是Windows Server 2008 R2上的PowerShell v3。我一直无法在本地重现这一点,但我没有像我们的生产域中那样设置用户(我正在研究这个,但我想发布这个ASAP希望有人知道发生了什么!)。

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的2008 R2盒子上创建相同的作业   V3。使用Start-Job从PowerShell运行的两个作业都运行良好。但是在   GUI,我为每周工作得到了同样的错误。

     

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

     

我将每周任务重置为今天运行,它仍然存在   失败。我还测试了每周一次的任务   PowerShell,它运行得很好。

     

我将每周作业更改为使用与当前用户相同的帐户   它运行得很好。将其更改回其他帐户   失败了。我不知道触发器之间的相关性   和帐户。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

如果不是,请告诉我。我想按照这个主题将此方案纳入故障排除指南。

谢谢, June Blender(juneb) 高级程序设计作家,微软

答案 2 :(得分:0)

我终于找到了这种行为的解决方案。我安排了每个星期天执行的任务来运行powershell脚本。脚本本身运行良好。然后我尝试在任务调度程序中手动启动它。这以错误41306结束。在这里阅读你的评论后,我改变了时间表,不是先运行下一个星期日,而是从最后一个星期日开始(所以开始日期是过去的)。之后,我可以毫无问题地立即启动它。

答案 3 :(得分:-1)

所以预定作业在任务调度程序中运行,但没有真正紧密的集成。注册预定作业时,会创建预定作业定义,并且希望是Windows预定任务选项。在Windows计划任务成功触发该计划作业之前,没有创建任何计划作业实例作业,并且其成功运行得足够远,它创建了该实例。

我希望如果在预定作业失败的情况下,PowerShell至少会查询计划任务引擎并找出实例已启动但失败,并获取错误或其他原因。

所以基本上当你注册它时,你用触发器注册它,这可能会或可能不会发生,并且在PS失败之前会发生各种各样的事情......

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

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

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

令人遗憾,因为从PS方面来看,似乎什么也没发生,就预定的任务引擎而言,有一个历史记录,它试图运行并因特定的错误代码和消息而失败。

如果您希望能够在下一个版本中查看状态和原因失败的作业,请将我的错误投票给

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

答案 4 :(得分:-1)

在我的情况下,当我查看任务的历史记录时,我发现在创建任务时,它使用notepad.exe来尝试执行(因为notepad.exe被设置为打开{的默认值{1}}文件;因为它是编辑脚本的快捷方式)。这显然导致了一个问题。

要解决此问题,我右键单击了我的.ps1个脚本,然后选择PS1,并选择默认的open with(每个阅读此内容的人的路径可能会有所不同,所以我和#39;建议只需提取PowerShell快捷方式的属性即可获得特定路径。

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