38

我的域控制器上有一个小脚本,它设置为通过 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 将不再运行。

4

20 回答 20

46

将您的操作更改为:

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

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

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

于 2013-08-15T20:29:22.887 回答
8

尽管您可能已经找到了解决问题的方法,但我仍将发布此说明以使其他人受益。我遇到了类似的问题。我基本上使用不同的域帐户来测试和比较。该任务运行得很好,选中了“无论用户是否登录都运行”。

有几件事要记住并确保:

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

检查此链接,希望您或其他人可以从此信息中受益:https ://technet.microsoft.com/en-us/library/cc722152.aspx

于 2015-04-06T19:42:27.277 回答
7

注意:请确保您选择创建基本任务操作而不是创建任务操作。

我找到了以下解决方案:

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

  1. 右键单击powershell.exe图标
  2. 点击快捷键菜单下的属性
  3. 点击前进按钮;检查是否选中了“以管理员身份运行”。

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

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

在此处输入图像描述

于 2016-06-08T10:09:42.933 回答
3

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

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

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

如果是我的一个脚本,它是:

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

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

添加类型-AssemblyName“System.ServiceProcess”

以及下一个错误:

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

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

于 2018-09-07T10:10:55.070 回答
3

早上好,

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

于 2021-02-11T17:22:40.393 回答
2

实现了ExecutionPolicy Bypass让计划任务工作的参数。

Program: Powershell.exe
Add Arguments: -ExecutionPolicy Bypass -File C:\pscommandFile.ps1
于 2015-11-17T00:28:20.650 回答
1

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

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

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

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

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

于 2013-08-15T23:01:59.010 回答
1

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

这也可以帮助:

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

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

于 2014-01-28T07:21:29.860 回答
1

我认为这个问题的答案也很重要:

为什么我的计划任务正确更新其“上次运行时间”,并给出“(0x0)”的“上次运行结果”,但仍然无法正常工作?

摘要: Windows 2012 计划任务看不到正确的环境变量,包括PATH任务设置为运行的帐户。但是您可以对此进行测试,如果它正在发生,并且一旦您了解正在发生的事情,您就可以解决它。

于 2015-09-16T15:53:04.973 回答
1

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

将目标更改为 Windows Server 2016,如下面的屏幕截图所示,对我有用。

更改屏幕截图上的设置

于 2019-04-03T02:57:13.513 回答
0

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

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

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

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

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

于 2015-04-15T19:39:13.300 回答
0

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

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force

然后它起作用了

于 2020-06-24T20:19:22.023 回答
0

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

于 2019-02-27T04:17:10.007 回答
0

在运行这两个脚本时,我遇到了同样的问题。当我从任务调度程序手动执行它时,脚本执行完美。但它没有在预定的时间自动执行。

以下决议对我有用

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

一旦完成,等待脚本执行。

于 2019-11-14T11:07:24.290 回答
0

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

有关它的更多信息, 请在此处输入链接描述

于 2017-01-20T09:27:19.753 回答
0

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

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

要找到您的 powershell.exe,请参阅本文: https ://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations

于 2018-02-06T17:12:54.737 回答
0

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

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

于 2021-04-01T18:22:30.010 回答
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 日期开始感到困惑。

触发设置“Einmal”表示“一次性”,“Sofort”表示“一次”

于 2016-11-09T15:38:25.397 回答
0

我对这个问题的修复是确保我使用 ps1 文件中所有文件名的完整路径。

于 2020-06-25T16:53:59.523 回答
-3

在尝试了很多时间之后...

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

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

祝你好运 !

于 2015-02-08T20:50:53.437 回答