Powershell脚本不能通过计划任务运行

我的域控制器上有一个小脚本,它通过SMTP向我发送有关最新安全事件4740的电子邮件。

脚本手动执行时,将按预期运行; 但是,当设置为通过计划任务运行时,尽pipe显示已经执行,但没有任何反应(没有电子邮件)。

脚本如下:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { $arguments = "& '" + $myinvocation.mycommand.definition + "'" Start-Process powershell -Verb runAs -ArgumentList $arguments Break } $Event = Get-EventLog -LogName Security -InstanceId 4740 -Newest 5 $MailBody= $Event.Message + "`r`n`t" + $Event.TimeGenerated $MailSubject= "Security Event 4740 - Detected" $SmtpClient = New-Object system.net.mail.smtpClient $SmtpClient.host = "smtp.domain.com" $MailMessage = New-Object system.net.mail.mailmessage $MailMessage.from = "fromemail@domain.com" $MailMessage.To.add("toemail.domain.com") $MailMessage.IsBodyHtml = 1 $MailMessage.Subject = $MailSubject $MailMessage.Body = $MailBody $SmtpClient.Send($MailMessage) 

计划任务设置如下:

 RunsAs:LOCAL SYSTEM Trigger: On event - Log: Security, Event ID: 4740 Action: Start Program - C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe Argument: -executionpolicy bypass c:\path\event4740.ps1 

我也尝试了以下几点:

 Trigger: On event - Log: Security, Event ID: 4740 Action: Start Program - C:\path\event4740.ps1 

根据任务历史logging:任务开始,操作启动,创build任务过程,完成操作,任务完成。 我已经通过网站上的一些相同的“问题”的各种链接,但他们似乎都有某种我没有的变数。 我也尝试了一些提到的解决scheme,认为它们可能有些相关,但是唉,什么都没有起作用。 我甚至尝试删除我的计划任务,并重新设置它在这里提到: http : //blogs.technet.com/b/heyscriptingguy/archive/2012/08/11/weekend-scripter-use-the-windows-task-scheduler -to-运行一个窗口,PowerShell的script.aspx

有没有人遇到这种types的错误之前,或知道如何绕过这个问题?

故障排除:

我决定尝试通过计划的任务调用一个.bat文件。 我创build了一个简单的文件,将当前date/时间回显到受监视的文件夹。 手动运行文件并通过4740事件触发的任务实现了预期的结果。 将.bat文件更改为手动调用.ps1文件。 当由4740事件触发时,现在.bat将不再运行。

将您的操作更改为:

powershell -noprofile -executionpolicy bypass -file C:\path\event4740.ps1

编辑:更新

在Windows 2008服务器R2上:在“常规”选项卡下的“任务计划程序”中 – 确保将runAs用户设置为具有执行脚本所需的正确权限的帐户。

此外,我相信你有“只有当用户登录”运行选项签出。 将其更改为“运行用户是否已登录”。 不要选中不存储密码选项,你可能需要标记“运行最高权限”选项。

虽然你可能已经找到了解决你的问题的办法,但是我仍然会发布这个笔记来让别人受益。 我遇到了类似的问题。 我基本上使用不同的域帐户来测试和比较。 任务运行得很好,选中“运行用户是否登录”。

有几件事要牢记,并确保:

  1. 用于执行任务的帐户必须具有服务器本地安全策略下的“作为批处理作业登录”权限(或者是本地管理员组的成员)。 您必须指定运行脚本/ bat文件所需的帐户。
  2. 确保你输入了正确的密码字符
  3. 如果您以“运行用户是否已登录”的方式运行,则2008 R2中的任务不会特别交互式运行。 这可能会失败,特别是如果在脚本上查找任何对象/资源特定于用户配置文件时创建任务,因为PowerShell会话将需要该信息启动,否则将启动并立即结束。 以“运行用户是否登录”的方式运行脚本时定义$ Path的例子,我指定了映射的驱动器。 当任务启动时,它会查找该驱动器,但是由于验证用于运行任务的用户帐户没有登录,并且在脚本中,您将引用回源\对象,它需要对付它不存在任务将只是终止。 映射驱动器(\服务器\共享)x:\与实际的UNC路径\服务器\共享
  4. 审查你的步骤,脚本,参数。 有时候,即使你多次完成了这个过程,最小的一块也可以有很大的改变。 有时在输入密码或分号时有时候错过了一个字符,有时候在编写脚本或任务时。

检查提供的链接,希望你或其他人可以从这个信息中受益。 注意安全。

 https://technet.microsoft.com/en-us/library/cc722152.aspx 

除了上面的建议,我得到错误,并找到解决方案,在以下链接http://blog.vanmeeuwen-online.nl/2012/12/error-value-2147942523-on-scheduled.html

这也可以帮助:

在任务计划程序中,单击计划的作业属性,然后单击设置。

在最后列出的选项中:“如果任务已经在运行,则下列规则适用:”从下拉列表中选择“停止现有实例”。

我想这个答案也是相关的:

为什么我的预定任务正确更新了“上次运行时间”,并给出了“(0x0)”的“最后运行结果”,但实际上还没有工作?

摘要: Windows 2012计划任务没有看到任务设置为运行的帐户的正确环境变量(包括PATH 但是,你可以测试一下,如果正在发生,一旦你明白发生了什么,你可以解决它。

要实现“以管理员身份运行”功能,我实现了以下标志:

 -ExecutionPolicy Bypass 

这只在执行Powershell文件时才起作用。 所以我把我的命令放到.ps1文件中,用-ExecutionPolicy Bypass运行它,现在我的计划任务按预期工作。

 Program: Powershell.exe Add Arguments: -ExecutionPolicy Bypass -File C:\pscommandFile.ps1 

找到适用于我的方案的成功解决方法:

不要注销,只要锁定会话!

由于此脚本在域控制器上运行,因此我通过远程桌面控制台登录到服务器,然后注销服务器以终止会话。 在任务计划程序中设置任务时,我使用的是无权访问的用户帐户和本地服务以脱机模式运行,或严格登录以运行脚本。

感谢Cole的一些故障排除帮助,我想到了RunAs函数,并决定尝试解决无法正常工作的登录。

从任务计划程序开始,我删除了手动创建的任务。 使用server 2008 R2中的新功能,我导航到事件查看器中的4740安全事件,并使用右键单击>将任务附加到此事件,然后按照提示操作,指向“操作”页面上的脚本。 任务创建后,我锁定了会话并终止了远程桌面控制台连接。 通过配置文件“锁定”而不是注销,一切都像它应该的工作。

我遇到了几乎相同的问题,但在server 2012 R2上略有不同。 我在Task Scheduler中有一个PowerShell脚本,可以将3个文件从一个位置复制到另一个位置。 如果我从PowerShell手动运行脚本,它就像一个魅力。 但从Task Scheduler运行时,它只复制前两个小文件,然后挂在第三个(大文件)。 而且我也得到了“操作员或管理员拒绝请求”的结果。 而且我在这个论坛上做了几乎所有的事情。

这是情景,我是如何为我修复的。 可能不适用于其他人,但以防万一:

方案:1.任务计划程序中的Powershell脚本2.使用服务器上本地管理员的域帐户3.选择“运行用户是否登录”4.运行最高权限

修复:1.我必须使用域帐户登录到服务器,以便它在C:\ Users中创建一个本地配置文件。 2.检查并使用户能够访问我在脚本中引用的所有驱动器

我相信#1是我的主要修补程序。 我希望这对其他人有用。

如果发现以下情况,我终于徘徊了两天,

1)使powershell.exe以管理员身份运行

  1. 右键单击powershell.exe图标
  2. 点击快捷键下的属性
  3. 点击提前按钮检查管理员选中运行。

2)在actin窗格下的任务计划程序窗口中,将以下脚本作为新命令添加

 %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NonInteractive -ExecutionPolicy Bypass -noexit -File "C:\ps1\BackUp.ps1" 

请确保参数是由Cole9350提到的小写

如果你在WIN 10下遇到这个问题,这可能会解决你的问题。 一个更新搞砸了任务调度。

http://answers.microsoft.com/en-us/windows/forum/windows_10-performance/anniversary-update-version-1607-build14393-breaks/d034ab52-5d49-4b92-976a-a1355b5a6e6d?page=2

这个评论解决了我的问题。

“关于”一次性“任务的提示非常有用 – 在MS解决问题之前,这将是一个解决方法。 就我所能看到的,“每日”的唯一优点是缺少与运行时间相关的任意日期。 这可能会让其他人困惑,为什么这个工作将在X日开始。

触发设置“Einmal”意思是“一次”,“Sofort”意思是“一次”

在我的情况下(同样的问题)帮助添加-NoProfile在任务操作命令参数,并选中复选框“以最高权限运行”,因为我的服务器上UAC是(活动)。

更多关于它的信息在这里输入链接描述

尝试了很多时间之后…

任务计划程序:powershell.exe -noexit&。\ your_script.ps1

一定要把你的脚本放在这个文件夹中:windows \ system32

祝你好运 !