我的域控制器上有一个小脚本,设置为通过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将不再运行。
答案 0 :(得分:29)
将您的操作更改为:
powershell -noprofile -executionpolicy bypass -file C:\path\event4740.ps1
在Windows 2008服务器R2上:在“常规”选项卡下的任务计划程序中 - 确保将“运行方式”用户设置为具有执行脚本所需权限的帐户。
此外,我相信您已选中“仅在用户登录时运行”选项已选中。将其更改为“运行用户是否登录”。不选中“不存储密码”选项,您可能需要标记“以最高权限运行”选项。
答案 1 :(得分:6)
虽然您可能已经找到了解决问题的方法,但我仍然会将此笔记发布给其他人。我遇到了类似的问题。 我基本上使用不同的域帐户进行测试和比较。任务运行得很好"运行是否用户登录"检查。
要记住以下事项并确保:
检查此链接,希望您或其他人可以从此信息中受益: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)
我认为答案也是相关的:
摘要:Windows 2012计划任务执行 查看任务设置为运行的帐户的正确环境变量,包括PATH
。但是你可以测试这个,如果它正在发生,一旦你理解了发生了什么,你就可以解决它。
答案 7 :(得分:1)
如果您没有任何错误消息并且不知道问题出在哪里-为什么PowerShell脚本不想从计划任务开始,请执行以下步骤来获取答案:
您应该能够看到所有错误通知。
如果我的脚本之一是:
“无法找到类型[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,如下面的屏幕截图所示,对我来说很成功。
答案 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下遇到此问题,这可能会解决您的问题。更新搞砸了任务调度程序。
此评论解决了我的问题。
'关于“一次性”任务的提示非常有效 - 在MS修复问题之前,这绝对是一种解决方法。据我所知,“每日”的唯一优势是缺少与运行时间相关的任意日期。对于其他人来说,为什么这项工作将在X日期开始时可能会让人感到困惑。'
Trigger settings "Einmal" means "one-time", "Sofort" means "At once"
答案 17 :(得分:0)
答案 18 :(得分:0)
如果发现以下情况,我最后徘徊了两天寻求解决方案:
1)使powershell.exe以此
的管理员身份运行
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
祝你好运!