batch-file - 如何循环浏览 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
我还希望我的代码检查是否有任何未在文本文件中注册的新服务。经过几次尝试后,我找不到一种方法来实现我的想法。我怎样才能做到这一点?
解决方案
@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 上运行。
推荐阅读
- php - 最佳实践:如何在没有框架的情况下使用领域模型实现多对多关系
- http-headers - Facebook App Events API:服务器事件的 X-Forwarded-For HTTP 标头应该是什么?
- hosting - 发现恶意文件时阻止 cPanel 帐户上的端口 80 和其他端口
- c# - xUnit 用假的替换第三方类实例
- c# - 复杂的泛型需要一些奇怪的铸件才能运行
- python - python:指定模拟模块属性的返回值
- python-2.7 - 在 Python 中将纬度、经度和高度转换为本地 ENU 坐标
- c# - System.Net.Http.HttpClient 禁用缓存(.Net 标准项目)
- java - 在 JUnit 测试期间禁用部分 Java 程序
- python - 为什么即使没有相同的变量和函数名称也会出现类型错误?