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

时间:2013-08-15 19:11:50

标签: windows powershell scheduled-tasks

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

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

脚本如下:

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

根据任务历史记录:任务已启动,已启动操作,已创建任务流程,已完成操作,任务已完成。我在网站上查看了一些具有相同“问题”的各种链接,但它们似乎都有某种我没有的变量。我也尝试了一些提到的解决方案,认为它们可能有些相关,但唉,什么都没有用。我甚至尝试删除我的计划任务并按照此处所述重置它:http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/11/weekend-scripter-use-the-windows-task-scheduler-to-run-a-windows-powershell-script.aspx

之前是否有人遇到此类错误或知道如何绕过此问题?

故障排除:

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

21 个答案:

答案 0 :(得分:29)

将您的操作更改为:

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

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

此外,我相信您已选中“仅在用户登录时运行”选项已选中。将其更改为“运行用户是否登录”。不选中“不存储密码”选项,您可能需要标记“以最高权限运行”选项。

答案 1 :(得分:6)

虽然您可能已经找到了解决问题的方法,但我仍然会将此笔记发布给其他人。我遇到了类似的问题。 我基本上使用不同的域帐户进行测试和比较。任务运行得很好"运行是否用户登录"检查。

要记住以下事项并确保:

  1. 用于执行任务的帐户必须具有"作为批处理作业登录"服务器本地安全策略下的权限(或者是本地Admin组的成员)。您必须指定运行脚本/ bat文件所需的帐户。
  2. 确保输入正确的密码字符
  3. 2008 R2中的任务如果以#34运行,则不会以交互方式运行;运行用户是否登录"。如果在创建任务时您正在查找特定于用户配置文件的任何对象\资源的脚本,这可能会失败,因为powershell会话将需要该信息启动,否则它将开始并立即结束。 作为在运行脚本时定义$ Path的示例"运行用户是否登录"我指定一个映射的驱动器。当任务开始时,它会查找该驱动器,但由于验证运行任务的用户帐户未登录,并且您正在引用它需要对其工作的源\对象的脚本不存在任务将刚刚终止。 映射驱动器(\ server \ share)x:\与实际UNC路径\ server \ share
  4. 检查您的步骤,脚本,参数。即使您多次完成此过程,有时最小的部分也会产生很大的不同。输入密码时我错过了几次字符,有时在构建脚本或任务时错过了分号。
  5. 检查此链接,希望您或其他人可以从此信息中受益:https://technet.microsoft.com/en-us/library/cc722152.aspx

答案 2 :(得分:3)

早上好,

我知道这是一个旧线程,但我只是在寻找类似问题时遇到了它 - 脚本已成功运行但未完成其工作。我找不到对我有帮助的帖子,但我的问题是我以域管理员身份运行脚本。当我按照帖子的建议将域管理员添加到本地管理员组时,它起作用了。我希望这能帮助其他和我遇到同样问题的人。

答案 3 :(得分:2)

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

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

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

感谢Cole提供的一些故障排除帮助,我开始考虑RunAs功能,并决定尝试解决无法正常运行的登录问题。

从任务计划程序开始,我删除了手动创建的任务。使用Server 2008 R2中的新功能,我在事件查看器中导航到4740安全事件,并使用右键单击>将任务附加到此事件...并按照提示操作,指向操作页面上的脚本。创建任务后,我锁定了会话并终止了我的远程桌面控制台连接。如果配置文件“已锁定”并且未注销,则一切正常。

答案 4 :(得分:2)

实现"以管理员身份运行"功能我实现了标志:

-ExecutionPolicy Bypass

执行Powershell文件时似乎只会生效。 所以我把命令放到.ps1文件中,用-ExecutionPolicy Bypass运行它,现在我的计划任务按预期运行。

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

答案 5 :(得分:1)

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

这也有帮助:

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

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

答案 6 :(得分:1)

我认为答案也是相关的:

Why is my Scheduled Task updating its 'Last Run Time' correctly, and giving a 'Last Run Result' of '(0x0)', but still not actually working?

摘要:Windows 2012计划任务执行 查看任务设置为运行的帐户的正确环境变量,包括PATH。但是你可以测试这个,如果它正在发生,一旦你理解了发生了什么,你就可以解决它。

答案 7 :(得分:1)

如果您没有任何错误消息并且不知道问题出在哪里-为什么PowerShell脚本不想从计划任务开始,请执行以下步骤来获取答案:

  1. 以已为“计划任务”设置为执行PowerShell脚本的用户身份运行CMD
  2. 浏览到PowerShell脚本所在的文件夹
  3. 执行PowerShell脚本(删除脚本中是否存在任何阻止错误通知的语句,例如$ ErrorActionPreference ='silentlycontinue')

您应该能够看到所有错误通知。

如果我的脚本之一是:

“无法找到类型[System.ServiceProcess.ServiceController]。请确保已加载包含该类型的程序集。”

在这种情况下,我必须在脚本的开头添加其他行以加载缺少的程序集:

添加类型-AssemblyName“ System.ServiceProcess”

接下来的错误:

使用“ 1”参数调用“ GetServices”的异常:“无法在计算机上打开服务控制管理器。此操作可能需要其他特权。”

select:无法处理该属性,因为属性“数据库名称”已经存在

答案 8 :(得分:0)

我遇到了类似的问题,其中只有一半的脚本可以使用任务调度程序运行,但在手动运行脚本的同一帐户下可以正常运行。问题是我正在引用我自己的模块。当我将函数直接添加到我的脚本文件中时,任务调度程序工作,但是当我使用模块任务调度程序时失败。在相同帐户下运行的相同编码(模块)在没有任务调度程序的情况下运行良好。

我认为这是 Windows 如何处理运行时环境变量的某种类型的问题。当我通过完整路径(而不是模块名称)引用模块时,它在任务调度程序中工作。

答案 9 :(得分:0)

我解决此问题的方法是确保对ps1文件中的所有文件名使用完整路径。

答案 10 :(得分:0)

在我的情况下,这与未签名的ps1脚本中的.ps1引用有关(您需要在文件属性中取消阻止),我也将其添加为第一行:

Set-ExecutionPolicy -ExecutionPolicy无限制-强制

然后它起作用了

答案 11 :(得分:0)

在运行两个脚本时,我遇到了同样的问题。当我从任务计划程序手动执行该脚本时,该脚本可以完美执行。 但是它没有在计划的时间自动执行。

以下解决方案对我有用

找到powershell exe的位置,右键单击并转到安全选项,将“经过身份验证的用户”添加到组或用户名中,然后进行完全控制。

完成后,等待脚本执行。

答案 12 :(得分:0)

另一个可行的想法。这确实很愚蠢,但是很明显,默认的目标操作系统设置(屏幕的右下角)是Vista / Windows Server 2008。由于我们已经超过了10年,因此您的Powershell脚本可能与此不兼容。

将目标更改为Windows Server 2016,如下面的屏幕截图所示,对我来说很成功。

Change the setting on the screenshot

答案 13 :(得分:0)

我有一个非常相似的问题,在手动运行计划任务时,我一直将VSC窗口与powershell脚本保持在一起。刚关闭它,它便按预期开始工作。

答案 14 :(得分:0)

我有另一种可能适用于你们这个问题的解决方案。

在我创建了power shell(xyz.ps1)脚本后,我在记事本中打开它以供后续编辑。因此,Windows在我的xyz.ps1文件与notepad.exe之间建立了关联,而Scheduler试图在后台运行带有notepad.exe的电源shell脚本(xyz.ps1)而不是在Powershell中执行它。我通过密切关注调度程序中的“显示所有正在运行的任务”部分来发现此问题,该部分显示正在使用notepad.exe来运行xyz.ps1脚本。为了验证这一点,我右键单击了Windows资源管理器中的xyz.ps1文件,转到“属性”,它显示记事本对“打开方式”部分。然后我将“打开方式”更改为%SystemRoot%\ SysWOW64 \ WindowsPowerShell \ v1.0 \ powershell.exe。这样做了。现在,调度程序将使用powershell.exe执行我的xyz.ps1并给我所需的结果。

要找到powershell.exe,请参阅此文章: https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations

答案 15 :(得分:0)

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

有关它的更多信息 enter link description here

答案 16 :(得分:0)

如果您在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日期开始时可能会让人感到困惑。'

Trigger settings "Einmal" means "one-time", "Sofort" means "At once"

答案 17 :(得分:0)

请确保https://jsfiddle.net/2wwfxfqy/1/

提到的参数为小写

答案 18 :(得分:0)

如果发现以下情况,我最后徘徊了两天寻求解决方案:

  

1)使powershell.exe以此

的管理员身份运行
  1. 右键单击powershell.exe图标
  2. 点击快捷键
  3. 下的属性
  4. 单击“提前”按钮,以管理员身份检查运行 检查。
  5.   

    2)在肌动蛋白窗格ad下的任务调度窗口中   以下脚本作为新命令

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

答案 19 :(得分:0)

我遇到了与此问题几乎相同的问题,但在Server 2012 R2上略有不同。我在任务计划程序中有一个powershell脚本,它将3个文件从一个位置复制到另一个位置。如果我从powershell手动运行脚本,它就像一个魅力。但是当从任务计划程序运行时,它只复制前2个小文件,然后挂在第3个(大文件)。我也得到了结果"运营商或管理员拒绝了请求"。我在这个论坛上做了几乎所有的事情。

以下是该方案以及我如何为我修复它。可能不适合其他人,但以防万一:

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

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

我相信#1是我的主要解决方案。我希望这对其他人有用。

答案 20 :(得分:-2)

经过大量的努力......

任务调度程序:powershell.exe -noexit& \ your_script.ps1

请务必将您的脚本放在此文件夹中:windows \ system32

祝你好运!