首页 > 解决方案 > 如何循环浏览 Windows 服务并将它们与文本文件进行批量比较

问题描述

我做了一个安全检查的批处理代码,看看是否有任何系统服务被修改。

这通过以前注册的文本文件起作用,该文件包含每个 Windows 服务的名称。

AJRouter
ALG
AppIDSvc
Appinfo
AppReadiness
AppXSvc
AudioEndpointBuilder
Audiosrv
autotimesvc
AxInstSV
BDESVC
BFE
BITS
...

我设法完成了代码在文本文件的每一行上循环的部分,并检查是否缺少任何 Windows 服务。

@echo off
for /F "tokens=*" %%A in (WindowsServices.txt) do (
    SC QUERY %%A > NUL
    IF ERRORLEVEL 1060 (ECHO %%A IS MISSING)
)

PAUSE

我还希望我的代码检查是否有任何未在文本文件中注册的新服务。经过几次尝试后,我找不到一种方法来实现我的想法。我怎样才能做到这一点?

标签: batch-file

解决方案


@echo off

(   for /f "tokens=1,*" %%A in (
        'sc query type^= service type^= userservice state^= all ^| find "SERVICE_NAME:"'
    ) do @echo %%B
) > all.tmp

(   for /f "tokens=*" %%A in (
        'findstr /b /e /i /l /v /g:"WindowsServices.txt" "all.tmp"'
    ) do @echo + %%A

    for /f "tokens=*" %%A in (
        'findstr /b /e /i /l /v /g:"all.tmp" "WindowsServices.txt"'
    ) do @echo - %%A

    for /f "tokens=*" %%A in (
        'findstr /b /e /i /l /g:"all.tmp" "WindowsServices.txt"'
    ) do @echo   %%A
) > report.txt

del all.tmp
sort /+3 report.txt /o report.txt
type report.txt

如果您想进一步处理输出,请使用可能更易于阅读且更易于使用脚本处理的输出格式。

输出解释为:

  • 如果+以 开头,则需要添加到 WindowsServices.txt 即新建。
  • 如果-以 开头,则在 WindowsServices.txt 中,但不在注册表中,即 Missing。
  • 如果以空格开头,则位于 WindowsServices.txt 和注册表中,即 Good。

如果不想要列出的最后一项,即好,则删除最后一个for循环。我添加它是为了完整性,以便考虑所有服务名称。

findstr用途:

  • /b如果在行首,则匹配模式。
  • /e如果在行尾匹配模式。
  • /i指定搜索不区分大小写。
  • /l按字面意思使用搜索字符串。
  • /g从指定文件中获取搜索字符串。

sort按字母顺序获取所有服务名称。

注意:早期的 Windows 操作系统可能没有 的userservice类型sc.exe,例如 Windows 7。代码无需修改即可在 Windows 10 上运行。


推荐阅读