精华内容
下载资源
问答
  • 计划任务两种计划任务单次的计划任务——at周期性的计划任务——crontab文件格式用法指定某些用户可以执行计划任务用/etc/crontab添加计划任务crontab -e /etc/crontab 区别 两种计划任务 单次的计划任务 周期性...
  • 定时任务,也叫例行性工作调度,我们需要让linux系统按我们指定的时间规则自动的处理某些作业,例如在某个时间点执行某个脚本,周期性的备份数据,这时候就可以制定任务计划了,任务计划分为一次性周期性两类 ...

    计划任务

    定时任务,也叫例行性工作调度,我们需要让linux系统按我们指定的时间规则自动的处理某些作业,例如在某个时间点执行某个脚本,周期性的备份数据,这时候就可以制定任务计划了,任务计划分为一次性和周期性两类

    一次性: 只会执行一次的命令

    • at
      at是个可以处理仅执行一次就结束调度的指令,不过要执行 at 时,必须要有 atd 这个服务 的支持,在某些新版的distributions 中,atd可能默认并没有启动,不过 CentOS默认是启动的

    周期性:就是每隔一定的周期就要来办的事项

    • crontab
      crontab 这个指令所设置的工作将会循环的一直进行下去, 可循环的时间为分钟、小时、每周、每月或每年等,crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支持, 至于让 crontab 可以生效的服务则是 crond 这个服务
    • 一次性计划任务
      atd的启动与at运行的方式要使用单一工作调度时,我们的 Linux 系统上面必须要有负责这个调度的服务,那就是 atd 这个玩意儿,不过并非所有的Linux distributions 都默认会把他打开的,某些时候我们必须要手动将他启用才行
      在这里插入图片描述
    • at的运行方式
      一次性任务计划,意思就是执行完一次后就没有了,可以通过at或batch命令生成,计划内容会以文件的形式写入/var/spool/at目录中,一个任务计划对应一个文件,系统的服务进程atd(at daemon)会读取这些文件并执行,某任务执行完毕后,其对应的文件也会被自动删除
    • 使用方法
      生成一次性任务计划
      用法:at [option]… [TIME]

    ~]# yum install at
    ~]# systemctl restart atd
    ~]# systemctl enable atd
    ~]# systemctl status atd
    ● atd.service - Job spooling tools
    Loaded: loaded (/usr/lib/systemd/system/atd.service;
    enabled; vendor preset: enabled)
    Active: active (running) since 一 2019-06-17 11:04:22
    CST; 9s ago
    Main PID: 47922 (atd)
    at命令后不能为空,必须接选项或参数
    常用选项:
    任务计划创建格式:
    at TIME
    COMMAND1
    COMMAND2

    按Ctrl+D结束,结束符为EOT
    TIME格式:
    HH:MM 如14:30
    HH:MM YYYY-MM-DD 如14:30 2015-10-07
    HH:MM[am|pm] [Month] [Date] 如02:30pm October 07
    HH:MM[am|pm] + number [minutes|hours|days|weeks] 如
    14:30 + 2 weeks
    now + #UNIT 如now + 5minutes
    noon,midnight,teatime,tomrrow
    其它命令:
    atq:查看待执行任务列表,相当于at -l
    atrm:删除指定作业,相当于at -d
    -d 作业编号:删除指定的待执行任务,相当于atrm
    -l:显示待执行的任务的列表,相当于atq
    -m:任务执行完成后向用户发送E-mail
    -c 作业编号:显示指定作业的实际内容
    注:任务作业执行后,若有错误或标准输出,则会以邮件形式告知提交者,可重定向至其 他地方或干脆丢弃(> /dev/null)
    //常用时间中英文对照
    一月January —— Jan
    二月February —— Feb
    三月March —— Mar
    四月April —— Apr
    五月May —— May
    六月June —— Jun
    七月July —— Jul
    八月August—— Aug
    九月September —— Sept
    十月October —— Oct
    十一月November —— Nov
    十二月December—— Dec
    星期一:Monday, 英文缩写Mon
    星期二:Tuesday,英文缩写Tue
    星期三:Wednesday,英文缩写Wed
    星期四:Thursday,英文缩写Thur
    星期五:Friday,英文缩写Fri
    星期六:Saturday,英文缩写Sat
    星期日:Sunday,英文缩写Sun

    • batch
      batch不同于at的地方仅在于其所生成的任务计划是在系统空闲时执行的,故batch命令不能指定时间
      他会在 CPU 的工作负载小于 0.8 的时候,才进行你所下达的工作任务,也就是说,当CPU 的工作负载越大,代表 CPU 必须要在不同的工作之间进行频繁的工作切换, 因为一直切换工作,所以会导致系统忙碌, 系统如果很忙碌,还要额外进行 at ,就不太合理,所以才有batch指令的产生
      //查看CPU负载
      [root@base ~]# uptime
      uptime命令能够打印系统总共运行了多长时间和系统的平均负载
      如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的,如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题,如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了

    循环执行的例行性工作调度

    周期性任务计划是由crond系统服务来控制的,与atd服务一样,crond也是默认启动的工作于后台的守护进程,crond执行的每一项任务都会被记到/var/log/cron这个日志文件中

    • 周期性任务计划分两类
      ①系统cron:定义在/etc/crontab文件中,直接编辑即可
      ②用户cron:定义在/var/spool/cron目录中,每个用户都有一个与用户名同名的文件,其功能类似于/etc/crontab,使用crontab命令生成
      系统通常自带cron服务程序和crontab命令,若没有,可使用如下命令安装:
      yum -y install vixie-cron #cron服务程序包
      yum -y install crontabs #crontab程序包

    [root@base ~]# systemctl status crond
    ● crond.service - Command Scheduler
    Loaded: loaded (/usr/lib/systemd/system/crond.service;
    enabled; vendor preset: enabled)
    Active: active (running) since Tue 2020-05-12 00:00:23
    CST; 10h ago
    Main PID: 6232 (crond)
    CGroup: /system.slice/crond.service
    └─6232 /usr/sbin/crond -n

    • 用户周期任务
      使用crontab命令创建用户cron
      用法:

    crontab [-u username] [-elr]

    选项:

    -u:管理员可为其他用户创建任务
    -e:打开编辑页面定义任务
    -l:列出已经定义的所有任务
    -r:移除所有任务

    crontab -e打开编辑页面后,一行一个任务进行编辑,每行包括6段,前5段为时间,最后一段为要执行的命令,格式如下:

    分钟 小时 日 月 周几 命令

    • 系统周期性任务计划
      系统的配置文件:/etc/crontab
      这个“ crontab -e ”是针对使用者的 cron 来设计的,如果是“系统的例行性任务”时,只要编辑 /etc/crontab 这个文件就可以了

    [root@base ~]# ll /etc/crontab
    -rw-r–r--. 1 root root 451 Jun 10 2014 /etc/crontab

    可以 root 的身份编辑一下这个文件,基本上 cron 这个服务的最低侦测限制是“分钟”,所以“ cron 会每分钟去读取一次 /etc/crontab与/var/spool/cron 里面的数据内容 ”,因此,只要你编辑完 /etc/crontab 这个文件,并且将他储存之后,那么 cron 的设置就自动的会来执行了


    展开全文
  • 作为一名至今还在坚守着64位XP的XP用到死星人,因为准备升级电脑,所以准备移民外星,开始...为了装新机器,同时为了拾起扔了不少年的电脑技术,研究了一段时间的Windows7,也看了一下Windows810,真没有多少让人...

    作为一名至今还在坚守着64位XP的XP用到死星人,因为准备升级电脑,所以准备移民外星,开始使用Windows7。其实我新电脑买来一年了,为了坚守XP,扔在一边没有装(华硕Z9PE-D8 WS主板,双E5-2637CPU,32G内存,8个SSD硬盘,4个显卡)。

    为了装新机器,同时为了拾起扔了不少年的电脑技术,研究了一段时间的Windows7,也看了一下Windows8和10,真没有多少让人欢喜的功能。能值得称道的就是Windows8的任务管理器了,确实很不错,很漂亮也很人性化。

    其他UAC、库等等都是学的半拉拉东西,还有很多赶流行,卖概念的东西。

    说系统就不能不说安全性,理论上说这个新系统(至少比XP新),至少安全性设置上,应该更安全才对,但是Windows7中个任务计划是怎么回事呢?在Windows7中任务计划的服务也不能关,也不能禁止用户创建任务计划,这不明显的是为流氓软件大开方便之门吗?微软居心何在,牺牲广大用户的利益和软件开发商玩默契吗?

    一般用户面对任务计划+流氓软件毫无还手之力,就是有一定水平的用户稍微的不注意,也只能甘拜下风。下面就以WPS为例,说说应对方法。

    WPS的自动升级设置,在以前的某些版本中是很让人无语的,里面的选项不是让你选自动升级还是手动升级或者是不升级,而是让你选自动静默升级和自动升级,甚至只有一个选项,自动静默升级,后来的版本的中国特色“免费”内容也给加足了,在广大用户一片声讨声中,终于能选不自动升级了。

    WPS的升级就是靠任务计划,禁用或者是删除了WPS的任务计划也没有用,每次开启WPS都会把任务计划重置,即使选择不自动升级WPS,WPS的任务计划还是要运行,估计程序确实是不负责升级程序版本,但是负责为广大的用户及时的提供最新的中国特色“免费”内容。让一般的WPS用户去应付WPS的升级和任务计划是很不现实的,就是有一定电脑使用水平的人,每次开启WPS之后都再去禁用WPS的任务计划也是很繁琐的,并且任务计划管理器打开的速度是很慢的。

    如果不考虑WPS的流氓,WPS其实是个很不错的软件,但就是因为其流氓太过,让人生厌。所以很多喜欢“我的地盘我做主”或者虽然喜欢WPS不喜欢被流氓欺负的人,很干脆的抛弃了WPS,各种精简版的office就这样的大行其道了。

    用任务计划管理计划任务对付任务计划流氓
     

    工具/原料

     
    • Windows7+
    • Windows任务计划管理器taskschd.msc
    • Windows事件查看器eventvwr.msc
    • 本地安全策略管理器secpol.msc

    用任务计划管理任务计划

     
    1. 1

      还好微软提供的任务计划功能足够强大,我们可以以子之矛攻子之盾。用任务计划来对付WPS一类的任务计划流氓,下面是实现流程。

      首先是准备工作,Windows7的任务计划是有日志的,但是微软默认的任务计划日志是没有开启的!!微软到底想干什么,那些一般人根本看不懂,也不会去看,大多也没有用的东西哗啦哗啦的记录一大堆,但是非常重要和用户关系非常紧密且比较容易看的懂的任务计划日志却不去开启。再次望天质问,微软居心何在!

      所以我们首先要打开任务计划的日志,从计算机管理—任务计划、管理工具—任务计划、运行—taskschd.msc等方法打开任务计划程序管理器。点击窗口右侧的“启用所有任务历史记录”,注意开启之后会显示为“禁用所有任务历史记录”,就是说当显示为“启用所有任务历史记录”的时候,任务计划的日志是关闭的,显示为“禁用所有任务历史记录”的时候任务计划的日志是开启的。从作用上看这启用/禁用应该是个选择按钮,但是这种显示方法和有字面上的叙述,实在是别扭偷透了。

      用任务计划管理计划任务对付任务计划流氓
    2. 2

      开启了任务计划日志之后,实验的先禁用WPS的任务计划,在任务计划程序库的根目录下面,有两个,分别是“WpsNotifyTask_Administrator”和“WpsUpdateTask_Administrator”。禁用之后再打开WPS,让WPS去重置上述的两个任务计划,下面我们可以去查看任务计划日志了。从计算机管理—事件查看器、管理工具—事件查看器、运行—eventvwr.msc等方法打开事件查看器。从窗口左侧依次选择:应用程序和服务日志——Microsoft——windows——TaskScheduler/Operational,这就是任务计划日志。

      用任务计划管理计划任务对付任务计划流氓
    3. 3

      看下图,其中事件ID:140就是WPS重置任务计划的ID号,这个ID号等一下有用。当然估计别的程序如果重置任务计划估计也是ID140,但是会去随意的重置任务计划的目前就遇到WPS一个,Chrome什么的,把它禁用,他就老老实实的禁用着。

      准备工作做完了,我们就祭出杀器“子之矛”,任务计划程序了。

      用任务计划管理计划任务对付任务计划流氓
    4. 4

      打开任务计划程序管理器,随便打开一个目录,创建一个计划任务。常规页,名字随便起,但是最好中间不要有空格,运行时的用户,当然是要权限更高的用户administrator或者system,administrator就够了,system的话不知道是否能收到消息。

      用任务计划管理计划任务对付任务计划流氓
    5. 5

      重要的触发器页面,点新建触发器,在新建触发器窗口中,开始任务类型选择“发生事件时”,开始任务类型选择“发生事件时”,开始任务类型选择“发生事件时”,看我连说三遍,大家都懂哈。

      用任务计划管理计划任务对付任务计划流氓
      用任务计划管理计划任务对付任务计划流氓
      用任务计划管理计划任务对付任务计划流氓
    6. 6

      选择发生事件时之后,设置对话框发生了改变,选择“基本”,日志选择“Microsoft-windows-TaskScheduler/Operational”,源选不选都可以,事件ID当然写140。如果不选择“基本”,而选择自定义,则可以填写多个事件ID,基本和自定义的差别就在这里。还有个延迟任务时间,选择任务延迟的原因是为了防止目标程序还没有执行完毕,即进行干预而产生错误,所以设置个延迟,这里可以接受输入,我输入了5秒,WPS进行140事件只是重置,并不是开始任务,wps的任务是从每小时运行一次。触发器设置完成了,一路的确定保存下来。下面的操作虽然重要,反而是最简单的。在操作页面,选择操作,应该的选择是启动程序。至于程序是什么,什么都行,程序,脚本。批处理都可以,大家可以尽情的发挥。作为测试,我选择了发送消息,这个发送消息输入框,需要用右键快捷菜单的打开ime才能使用我的谷歌拼音输入法,不能单纯的输入法切换,不知道此情况是不是通常状况。

      用任务计划管理计划任务对付任务计划流氓
    7. 7

      一路的确定保存,直至关闭新建任务的对话框。好了任务计划创建完成了,我们先测试一下是否能正常的运行。老办法,先禁用两个WPS任务计划,然后打开WPS。OK,收到消息了。根据WPS重置任务计划的触发的自建任务计划创建成功。嗯,这话真别嘴,以子之矛攻子之盾就这样。

      用任务计划管理计划任务对付任务计划流氓
    8. 8

      选择的任务计划还只能给出提示,想做什么干预就需要设置操作的启动程序了。要设置什么程序很简单。

      schtasks /delete /tn “任务名称” /f删除此任务计划

      schtasks /change /tn “任务名称” /DISABLE 

      禁用此任务计划schtasks /end /tn “任务名称” 停止此任务计划

      schtasks /query /tn “任务名称” 检索此任务计划

      schtasks /query 检索所有任务计划schtasks /query中cmd中运行需要chcp 437,中文环境下会出错。

      以上命令通过批处理VBS或者JS脚本等等方法组合判断,可以自动的成功干预WPS的任务计划了。

      经测试,WPS打开的情况下,禁用任务计划很快就被重置,所以禁用没有用。但是删除有用,删除了WPS的计划任务之后,不知道什么原因,我的2016版的WPS一小时之后才重新注册了任务计划。实际禁用任务之后,如果不通过命令或者查看日志,在任务计划管理器中是看不出WPS的任务计划是又重置为启用的,刷新也没有用,这是一种欺骗,让用户误认他的操作成功了,但是这种欺骗原理是什么??为什么会刷新没有用??微软在此问题上有不可推卸的责任!!以此类推那一小时之后重新注册任务计划也是欺骗,不过这就和微软没有关系了,是WPS的行为。

      用任务计划管理计划任务对付任务计划流氓
    9. 9

      以上是通过任务计划程序以子之矛攻子之盾干翻WPS的流氓任务计划的。通过监测任务计划日志,触发程序执行,已经可以完成的管理计任务计划了。大家有兴趣可以看看各个软件添加计划任务的事件ID,定义触发器,自动的执行任务计划管理,或者给予提示。像windows默认设置的那样什么程序都能偷偷摸摸的添加任务计划实在是太不像话了。

      END

    任务计划+SACL=系统安全大杀器

     
    1.  

      上面的功能虽然强大,但是还是只限于任务计划范围之内的东西,Windows的权限审核SACL系统+事件触发任务计划,才是是终极大杀器。

      所谓的SACL权限审核,就是大家看文件或者注册表权限,权限和所有者中间的那个东西——审核。有的朋友可能实验过,但是没有用。

      我简单的说一下这个东西的使用和作用。这个东西在过打开对象访问的审核之后,再进行审核设置,符合审核设置条件的将会记入系统日志安全。在本地安全策略—高级审核策略配置—系统审核策略-本地组策略对象—对象访问中打开或关闭对象审核,文件权限中设置的审核归审核文件系统管,注册表权限设置的审核当然归审核注册表管。

      用任务计划管理计划任务对付任务计划流氓
    2.  

      开启了审核访问之后,再去具体的目标设置SACL,如下图我设置了审核注册表项HKLM\SOFTWARE\7-Zip用户administrator的设置数值和删除成功操作的审核。然后我再7-Zip下随便建个值,然后删除。

      用任务计划管理计划任务对付任务计划流氓
    3.  

      然后到事件查看器中,打开Windows日志——安全,安全日志已成功记录了administrator对HKLM\SOFTWARE\7-Zip的操作。

      用任务计划管理计划任务对付任务计划流氓
    4.  

      SACL虽然是个老东西,出现很长时间里,应用的范围不大,但是作用非常强大,可以有目的的监控目标的各种操作,比如监控HKLM\SYSTEM\CurrentControlSet\service的创建子项,可以监控是否创建了服务,监控HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run是监控启动项,还有exe文件打开类型等重要的目标,当然可以监控任务计划,HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks.。如果仅仅的监控,意义不大,但是如果再加上任务计划的触发,就是安全管理大杀器了,什么什么工具箱的都可以卸载了。因为它们的功能还不如你设置的强大和适用。

    展开全文
  • 浅析windows计划任务

    2021-02-04 10:53:42
    在server2012上使用schtasks创建计划任务时,我们意外的发现,当分别使用参数/mo/ri时,计划任务创建的方式有所不同,具体如下图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uVJL2...

    win计划任务的变迁及其非常规排查

    研究背景

    在server2012上使用schtasks创建计划任务时,我们意外的发现,当分别使用参数/mo和/ri时,计划任务创建的方式有所不同,具体如下图: 在这里插入图片描述

    在这里插入图片描述我们在其参数说明中也未见对此现象的具体描述 在这里插入图片描述
    且在计划任务管理器上发现其区别似乎只在于触发器的不同。
    因此,抱着一探究竟的想法,我花了大致一周左右的时间研究并整理了此文,来为windows计划任务的相关问题提供些绵薄之力。

    本文中所研究的计划任务均由schtasks.exe创建。

    探索原因

    为了一探究竟,在server2012上,我们分别对两种启动流程进行了追踪,在初步的了解之后,我们发现随着windows系统的变迁,计划任务的相关进程的启动和计划任务的创建有旧版和新版之分,为了更好的理解,结合研究的内容下述依次对新旧版进行大致的说明。

    旧版的计划任务

    进程启动

    通过对计划任务的监控,我们发现,在server2012上,计划任务进程的启动,主要依赖于计划任务文件的读取和注册表项配置的访问。

    当使用参数/ri时,计划任务进程创建的堆栈如下图所示:

    在这里插入图片描述
    我们发现此时其进程创建的关键模块为schedsvc,通过堆栈我们可以大致看出此类计划任务进程的创建由schedsvc管理,schedsvc会启动回调job,从队列中捕获到并启动计划任务的job,进而创建计划任务进程。
    在schedsvc.dll中,我们可以清晰的看到,计划任务进程创建时,实际上创建的是taskeng.exe进程,这也解释了为什么我们看到此类计划任务的父进程是taskeng。
    在这里插入图片描述
    在这一参数创建的计划任务进程启动时,我们发现,schedsvc.dll与taskeng分工明确,schedsvc.dll主要负责注册表中对应计划任务的读取及更新,其中比较关键的行为是:schedsvc会负责从计划任务的job队列中启动计划任务,并且将计划任务进程的执行时间写入注册表项DynamicInfo中
    写入注册表项DynamicInfo的过程如下
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    写入注册表的值如下
    在这里插入图片描述
    写入后注册表中对应项的值如下
    在这里插入图片描述
    通过一定的分析,我们发现,在DynamicInfo注册表项中记录的二进制偏移+c处的内容正是其计划任务执行的UTC时间信息。
    在这里插入图片描述
    通过对计划任务进程行为的追踪,我们发现,每次计划任务进程被创建时,DynamicInfo注册表项均会被更新,也即是说,通过对注册表中的DynamicInfo的监控及其中时间数据的解析,我们可以得知某计划任务的进程在某时刻被执行,从而定位到对应的计划任务。
    taskeng则主要负责\Windows\System32\Tasks目录下的计划任务文件的读取及启动对应的计划任务进程
    Task文件读取如下
    在这里插入图片描述
    计划任务进程创建如下
    在这里插入图片描述

    当将参数更改为/mo时,我们发现此时的进程创建的堆栈完全改变了,如下图

    在这里插入图片描述
    我们可以看到,之前的schedsvc模块已经完全看不到了,取而代之的是UBPM和EventAggregation,关于UBPM,其全称是:统一后台进程管理器。它是自Windows 7和Windows Server 2008 R2引入的一种新的调度引擎,关于其更多的介绍,可以参考文末参考链接。而EventAggregation,其描述为“用户态的Event Aggregation库”(Event Aggregation User Mode Library)
    在这里插入图片描述
    从搜索引擎中,我们暂未找到关于其更详细的介绍,只知道其大致为事件聚合相关的用户态库,通过对计划任务进程行为的分析,我们可以看到,在计划任务进程启动的过程中,其主要扮演着对计划任务事件的处理、通知以及信号分发的角色。
    结合相关堆栈,我们初步认为UBPM主要负责捕获被称之为Trigger的信号,当Trigger到达时,便会执行对应的TriggerActions启动计划任务进程,这一部分会在后文现代的计划任务中进行部分说明。
    在winserver2012,根据UBPM的代码逻辑,计划任务进程启动时会在如下路径生成对应的计划任务ID的服务日志文件,并将计划任务的报告信息写入文件中。
    在这里插入图片描述
    其中记录的依然是计划任务进程执行的时间信息,依旧为UTC时间。
    在这里插入图片描述
    实际上,这也为我们提供了一个找到旧版UBPM调度引擎启动的对应计划任务的方法,我们可以直接在\Windows\System32\LogFiles\Scm文件夹,找到最新的文件,再根据文件名,在注册表中定位到计划任务的ID,从而定位到计划任务。

    计划任务的创建

    对于上述提到的/ri和/MO的这两个参数,计划任务创建的过程大致相同,在server2012上,负责计划任务创建的关键模块为schedsvc,在计划任务创建的过程中其会执行一系列操作,这里只简要对其中的关键行为进行说明,暂不做进一步挖掘。在后文中的现代的计划任务中也会做部分补充。
    获取task文件夹的安全描述符进行权限检查
    在这里插入图片描述
    读取对应注册表项的中的关键项信息
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    创建计划任务文件
    在这里插入图片描述
    设置对应计划任务在注册表中各子项的值
    在这里插入图片描述
    在这里插入图片描述
    即在计划任务创建的过程中,schedsvc主要负责获取相关计划任务的安全权限并对其进行检查,随后会对关键的注册表项TaskCache\Tasks\{ID}进行读取并创建计划任务文件,然后根据对关键注册表项的读取结果,再将注册表的各对应子项写入计划任务的相关内容。

    现代的计划任务

    然而,当我们把目光聚焦到较新的操作系统时,我们发现变化已然发生。

    进程启动

    在较新的windows版本中(此测试版本为win10 19042.685),我们发现在相关的schedsvc模块中旧版中的相关进程启动函数逻辑已经找不到了,之前的taskeng的执行逻辑也不复存在了。
    在这里插入图片描述
    取而代之的是,无论采用是 /MO还是/RI参数创建计划任务,计划任务的执行流程都统一由UBPM管理,其执行流程也和server2012上的略有不同,其堆栈情况如下 在这里插入图片描述
    我们可以看到UBPM依然在Trigger到达后,会对其进程处理,但是实际上多了一层封装
    在这里插入图片描述
    经过分析,此处,handle函数的参数a3是一个UBPM_TRIGGER_CONSUMER_BLOCK 结构体,此结构体随后会被作为参数传递到UbpmpPerformTriggerActions函数。a3+0x18偏移处是一个UBPM_INPUT_ACTION_PARAMS结构体,此值会被传入UbpmpLaunchExeAction函数的第一个参数用来启动对应的计划任务action。最终UBPM_INPUT_ACTION_PARAMS结构体会在UbpmpLaunchExeAction函数中进行解析后作为参数传递给UbpmpLaunchOneTask用来启动计划任务进程。
    在这里插入图片描述
    在UBPM_INPUT_ACTION_PARAMS结构体中记录了计划任务名称,计划任务内容等相关信息如下:
    在这里插入图片描述但是由于这些相关的结构体均未文档化,想要对其结构体进行进一步更详细的逆向分析需要耗费较长的时间,这也不是本文的目的,因此此处不做过多的展开。
    通过对进程创建过程中的行为的跟踪发现,现代的计划任务进程启动的过程中,更多的依赖于注册表内容的读取而非计划任务文件的读取,单纯靠计划任务文件的检测已经很难有所效果。
    此外,server2012中提到UBPM模式下的scm路径下的日志文件也不复存在,取而代之的是报告信息被写入到注册表DynamicInfo项中。与taskeng中的启动流程中的操作极为相似,其中依然包含计划任务进程的时间信息,在偏移+C处为其时间信息,依然采用的UTC时间。
    在这里插入图片描述 在这里插入图片描述在这里插入图片描述
    这也意味着,在现代的UBPM调度引擎启动的计划任务中,对计划任务的检测方向已经转移到了注册表中。我们需要对注册表DynamicInfo项中的数据进行解析,从而来确定某ID对应的计划任务进程在某一时刻曾被启动。

    计划任务的创建

    在现代的计划任务创建的流程中,我们发现对计划任务创建进行管理的关键模块依然是schedsvc.dll,但与server2012上的也有所不同,由于schedsvc模块功能多样且复杂,此处重点对SchRpcEnumTasks和SchRpcRegisterTask做一下补充说明。
    在计划任务创建的过程中,schedsvc的SchRpcEnumTasks,SchRpcRegisterTask函数起到关键作用。SchRpcEnumTasks函数会对计划任务的关键注册表进行检索。
    SchRpcEnumTasks主要负责对TaskCache\Tree注册表下各项计划任务的的SD(由于较新的系统上,注册表项中已引入SD子项,此处不再通过文件获取SD而是直接读取注册表下的读取),ID,Index等内容进行检索。
    SchRpcEnumTasks实际调用的是RpcServer::EnumFolder函数,在EnumFolder函数中首先会调用RegTreeEntryOpen来打开目标计划任务在tree中的对应注册表。
    在这里插入图片描述
    其后,在RpcServer::EnumFolder函数中,其会调用JobStore::RegJobSecurityQuery对SD进行检索,调用JobStore::RegGetTreeInfo对ID和Index进行检索,同时还会做一些权限的获取行为,调用FolderEnumerator::FindNext进行循环遍历。
    在这里插入图片描述
    在这里插入图片描述
    SchRpcRegisterTask负责管理具体计划任务的创建注册行为。
    SchRpcRegisterTask实际调用的是RpcServer::RegisterTask函数,在其中经过一系列的判断后,会调用RegTaskEntryCreate函数进行计划任务注册表项的实际创建和值的设置或调用UpdateTaskEntry进行更新。
    在这里插入图片描述
    其关键函数调用及对应注册表项与函数的创建关系大致如下图,其中箭头代表API调用,圆圈代表设置的注册表项,从上到下为大致的执行流程逻辑,通过这些函数关系,我们可以进一步探索对应注册表项里数据的更多含义,由于关系较为复杂,限于篇幅和时间,此处仅将其重要流程图做以展示,不做更多的展开。在这里插入图片描述
    当大部分注册表项相关值设置完毕后,schedsvc会调用JobStore::XmlSaveTaskFile函数将计划任务的内容写入到对应的tasks文件夹中的文件中,如\Windows\System32\Tasks\test。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    至此计划任务基本创建完毕。

    计划任务的检测与排查

    在前文中,我们断断续续的提到了部分关于计划任务检测与排查的思路,在这里,我们做下简单的总结,结合前文内容,我们可以将计划任务分为两大类。

    计划任务ID的获取

    对比server2012与win10中的计划任务的创建与启动情况,我们发现,在现代的计划任务中,微软对注册表的青睐显然更高一些,通过对计划任务进程创建的追踪我们发现,在传统的以taskeng进程启动的计划任务与现代的UBPM方式启动的计划任务的这一类方式中,在计划任务进程启动时,关于计划任务的执行时间信息均会被即时地记录在TaskCache\Tasks\{ID}\DynamicInfo注册表项中。
    对于此类计划任务,我们可以通过sysmon这类工具进行主动检测。设置简单的规则对DynamicInfo注册表进行检测,随后通过sysmon的日志进行确认排查
    当系统中有计划任务启动时,命中的sysmon规则效果如下图:
    在这里插入图片描述
    此外,结合上述分析,我们也可以自己写代码对对应注册表项进行遍历解析,获取计划任务的执行时间。核心代码如下:
    在这里插入图片描述
    代码获取到计划任务内容如下:
    在这里插入图片描述
    旧版的UBPM启动的这一类计划任务中,由于微软贴心地为我们提供了对应的计划任务日志文件,这使得我们可以直接通过文件的修改时间信息对计划任务进行定位,对应的文件路径通常为\Windows\System32\Tasks\{ID},如下:
    在这里插入图片描述

    定位注册表中的计划任务

    通过前文的方式获取到计划任务的ID后,我们就可以直接通过ID在注册表中搜索或直接在\Schedule\TaskCache\Tasks{ID}注册表位置找到对应注册表项,如下:
    在这里插入图片描述
    在其中我们可以看到关于计划任务的具体信息,在一定的情况下,只借助注册表中的计划任务信息,计划任务也可以被正常启动。因此,当排查到恶意的计划任务项时,我们需要同时清理C:\Windows\System32\Tasks\目录下的计划任务文件和上图中的对应ID的计划任务注册表内容。

    通过windows系统日志排查计划任务

    此外,通过windows系统自带的事件查看器,我们也能对计划任务进行定位和排查启动的计划任务的相关事件,再通过对应的计划任务事件名在注册表Schedule\TaskCache\Tree{name}或C:\Windows\System32\Tasks\目录下找到对应计划任务获取到对应的计划任务ID
    在这里插入图片描述在这里插入图片描述
    获取到ID后,再按照前文所述内容进行进一步的定位操作即可。

    小结

    从传统的taskeng及旧版的UBPM的混合使用到现代的UBPM,我们可以看到,微软似乎更倾向于从普通文件的记录转换到注册表中的统一管理,实际上,在现代的计划任务中,单纯的通过检测计划任务的文件,对于计划任务的实时检测来说是收益甚微的,因此,这也在提醒我们在计划任务的检测中,我们的检测重心也应该向注册表倾斜。实际上,关于计划任务相应注册表的各项含义还可以做进一步的挖掘来对计划任务做更深的了解,但由于篇幅和时间所限,本次研究在一些地方也只是浅尝辄止。
    纯的通过检测计划任务的文件,对于计划任务的实时检测来说是收益甚微的,因此,这也在提醒我们在计划任务的检测中,我们的检测重心也应该向注册表倾斜。实际上,关于计划任务相应注册表的各项含义还可以做进一步的挖掘来对计划任务做更深的了解,但由于篇幅和时间所限,本次研究在一些地方也只是浅尝辄止。
    本文仅从schtasks创建的计划任务出发,对旧版的计划任务和现代的计划任务的相关过程和关键行为做了简单的分析,并结合分析情况对计划任务的检测提出了一些建议以作抛砖引玉之用,文中若有不恰之处也欢迎讨论指正。

    展开全文
  • linux中有两种定时任务,一种是一次性定时任务“at”,一种是周期性定时任务“cron”; 二、一次性定时任务“at” 2.1启动服务 一次性定时任务需要“atd”这个东西支持才行。所以要启动它,命令如下 service atd ...

    一、概述

    linux中有两种定时任务,一种是一次性定时任务“at”,一种是周期性定时任务“cron”;

    二、一次性定时任务“at”

    2.1启动服务
    一次性定时任务需要“atd”这个东西支持才行。所以要启动它,命令如下
    service atd start 或 /etc/init.d/atd start
    注意:如果找不到这个服务,那就用"yum install at"进行安装一下
    2.2安全性
    我们可以利用 /etc/at.allow 和 /etc/at.deny 这两个文件来控制 at 的使用权限!
    意思很简单/etc/at.allow 是允许谁可以用at命令,/etc/at.deny是不允许谁使用at命令!
    2.3参数 at-[m,l,d,v,c,V,q]
    -m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
    -I atq的别名
    -d atrm的别名
    -v 显示任务将被执行的时间
    -c 打印任务的内容到标准输出
    -V 显示版本信息
    -q<列队> 使用指定的列队
    -f<文件> 从指定文件读入任务而不是从标准输入读入
    -t<时间参数> 以时间参数的形式提交要运行的任务
    2.4使用方法:

    • 提交一个at作业步骤:
      输入at命令同时指定作业执行的时间 ,按下Enter键;
      在at命令提示符“at >”下,输入命令或者shell脚本;
      Ctrl+D 提交at作业。
    • 另一种方式
      用 echo " " | at 23:34 的形式,来创建一次性计划任务
      在这里插入图片描述
      提交batch作业
      当需要提交一个作业而不关系其究竟何时执行时,可以使用batch命令。batch不需要指定时间,因为它会自动在系统负载比较低的时候执行(平均负载小于0.8的时候)
    [root@oracle ~]# batch
    at> pwd<EOT>
    job 7 at 2019-04-11 00:12
    [root@oracle ~]# at -l
    7       2019-04-11 00:12 b root
    [root@oracle ~]# atq
    7       2019-04-11 00:12 b root
    

    三、对于长期可循环的计划任务,使用crontab服务

    linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。
    3.1、crond服务

    安装crontab:

    yum install crontabs

    服务操作说明:

    /sbin/service crond start //启动服务

    /sbin/service crond stop //关闭服务

    /sbin/service crond restart //重启服务

    /sbin/service crond reload //重新载入配置

    /sbin/service crond status //查看服务状态

    查看crontab服务是否已设置为开机启动,执行命令:

    ntsysv

    加入开机自动启动:

    chkconfig –level 35 crond on
    其中:
    minute: 表示分钟,可以是从0到59之间的任何整数。

    hour:表示小时,可以是从0到23之间的任何整数。

    day:表示日期,可以是从1到31之间的任何整数。

    month:表示月份,可以是从1到12之间的任何整数。

    week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

    command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
    在这里插入图片描述
    在以上各个字段中,还可以使用以下特殊字符:

    星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

    逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

    中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

    正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • VC++创建计划任务的若干方式

    千次阅读 2018-09-30 09:02:06
    文章目录1. 创建计划任务的两种方式1.1 利用CMD... 使用Task Scheduler 1.0 管理计划任务2.1 创建计划任务2.2 枚举计划任务2.3 删除计划任务2.4 触发器结构体 TASK_TRIGGER2.5 创建触发器3. 使用Task Scheduler 2...
  • 终止进程的运行十.at命令,一次性任务设置十一.crontab命令,周期性任务设置crontab命令,设置用户的周期性计划任务列表 一.线程、进程、程序 程序:是保存在硬盘、光盘等介质中的可执行代码数据,可以包含一个...
  • 背景:  需要在windows服务器上定时做一些任务,写程序,...1.“管理工具” 里面去找“任务计划程序”或者“控制面板”里面去找“计划任务”,或者直接通过“开始”菜单搜索,主要是不同的系统,名字位置不一...
  • 使用atcron实现任务计划

    千次阅读 2018-08-04 11:44:43
    系统的延时任务和定时任务 1.延时任务(at) 使用at命令可以在某一指定时间内调度一项一次性作业,at命令后面必须先指定时间,接着指定日期 命令的用法: at [选项] [时间参数] at [选项] ...
  • php定时计划任务实现方法

    千次阅读 2017-06-09 14:25:28
    我在uchome 中 分析到, uchome是这样做的  1. 把所有的计划任务存放到数据库  2. 每次用户进行操作或打开页面的时候都按排序执行一条...上面只自己分析uchome代码关于计划任务大概的结果, 抛砖引玉. 希望谁有好的方
  • 1.计划任务只能执行的脚本只能控制无UI的应用程序(启动UI界面的程序不能采用) 2.用户文件夹自启动 打开文件资源管理器 C:\Users\你的用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 将bat...
  • WindowsServer下执行计划任务

    千次阅读 2020-05-16 21:48:55
    (2)点击任务计划程序 (3)点击创建任务 (4)输入任务名称 根据自己的需求判断是否需要一直运行(若需要则选择不管用户是否登录都运行) 建议勾选使用最高权限运行 (5)点击 触发器——新建 设置任务执行时间...
  • .NET Framework中为我们提供了3种类型的Timer,分别是: Server Timer(System.Timers.Timer),Thread Timer(System.Threading.Timer )Windows Timer(System....Server TimerThread Timer的区别在于,Serv
  • 效能工作任务管理软件帮助您对工作任务进行计划、重要性排序、提醒进度跟踪。有了她的帮助,您能够遵循“要事第一”的原则,对事情的轻重缓急一目了然。软件界面美观,简便易用,但同样功能强大。您可以设定任务的...
  • 任务计划,可以将任何脚本、程序或文档安排在某个时间运行。 可以按照如下的方式来启动:附件 -&gt; 系统工具 -&gt; 任务计划程序。 也可以在Win+R后,输入:taskschd.msc 命令来打开。 创建“基本...
  • CentOS7计划任务crontab

    2020-03-21 09:23:01
    文章目录一、计划任务的基本概念二、用户计划任务1、查看crontab文件2、编辑crontab文件3、删除crontab...linux系统采用crond守护进程来控制系统用户的计划任务,实现周期性的执行某种任务或处理某些事件。 Linux...
  • 单个用户的计划任务(单一一次的计划任务,周期性的计划任务) 系统级别的计划任务(大多是周期性的计划任务) 一、单一一次的计划任务at不是永久性生效的 使用方法: #atnow + 2 minutes >输入要执行的...
  • Linux计划任务执行结果手动执行不一致,发生原因有三种: 以下是计划任务和脚本情况介绍,写出具体代码是为了说明第三种情况 [root@salt-master 09]# crontab -l */1 * * * * /bin/sh /root/test03/09/01.sh >/...
  • 只有打开任务计划手动点运行以后才有效 但开机就是死活不启动 一直都是准备就绪状态 请各位大神指教!
  • 写了一个输出日志的bat,发现手动运行可以,用计划任务就没有输出日志文件,后来发现原来是路径的问题。 windows任务计划里面运行批处理的话,不识别相对路径。
  • 但凡要给自己定目标,考虑时间管理、效能提升的人,都绕不开这三个概念...弄不清楚三者关系并且各种混用的大有人在,比如说:周计划和任务、月目标计划、年目标计划区别是什么?你是否能说清楚?
  • windows2012任务计划不执行

    千次阅读 2018-05-15 09:34:00
    windows2012任务计划不执行 1、Windows Server 2008计划任务在哪里配置? 2、Windows Server 2008可以配置每分钟或是每小时执行我的任务吗? 答案是:可以! 首先Windows Server 2008不同于其他...
  • 很多人在问我: 1、Windows Server 2008 计划任务在哪里配置? 2、Windows Server 2008 可以配置... Server 2003有着很大的区别,计划任务的名称是“任务计划程序”不在控制面板里,而是在“管理工具”里。 由于服务
  • 因为在项目中有个需求是大批量的数据自动计算后插入更新到数据库中,为避免占用正常资源,需要在固定时间段进行自动计算,因为项目服务器是windows server2012,就考虑用windows平台强大的任务计划程序来实现。...
  • 软件测试方案测试计划区别软件测试一、测试计划:对测试全过程的组织、资源、原则等进行规定约束,并制订测试全过程各个阶段的任务以及时间进度安排,提出对各项任务的评估、风险分析需求管理。二、测试方案...
  • “只在用户登录时运行”的状态可以正常运行批处理文件; “不管用户是否登录都要运行”的时候就运行不了。 求解答
  • Linux—进程和计划任务管理

    千次阅读 2021-08-17 09:21:11
    文章目录前言一、查看控制进程 前言 一、查看控制进程
  • 任务/宏任务和同步/异步之间的关系

    千次阅读 多人点赞 2021-05-14 10:13:09
    彻底理清微任务/宏任务和同步/异步之间的关系 前言 网上已有很多相关的js执行机制的文章了,那为啥还要写这个? 原因是其中一个机制大家有两套说法,不多BB直接上争议点 ↓ 1.认为宏任务包含所有script代码的 2.宏...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 106,033
精华内容 42,413
关键字:

任务和计划的区别