繁体   English   中英

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

[英]Powershell script does not run via 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 将不再运行。

将您的操作更改为:

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

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

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

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

要记住并确保以下几点:

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

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

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

我找到了以下解决方案:

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"

在此处输入图片说明

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

-ExecutionPolicy Bypass

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

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

早上好,

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

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

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

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

如果我的脚本之一是:

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

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

添加类型 -AssemblyName "System.ServiceProcess"

和下一个错误:

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

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

找到了适用于我的场景的成功解决方法:

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

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

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

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

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

这也可以帮助:

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

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

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

为什么我的计划任务正确更新了它的“上次运行时间”,并给出了“(0x0)”的“上次运行结果”,但仍然没有实际工作?

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

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

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

更改屏幕截图上的设置

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

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

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

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

我相信 #1 对我来说是主要的修复方法。 我希望这对其他人有用。

请确保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 已打开(活动)。

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

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

在我创建了我的 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.exe 执行我的 xyz.ps1 并给我所需的结果。

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

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

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

以下决议对我有用

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

完成后等待脚本执行。

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

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force

然后它起作用了

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

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

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

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

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

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

祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM