应用程序经常向 Windows 添加新服务,其中一些服务即使没有必要也会自动启动,有时还会无缘无故地干扰其他程序。
有什么方法可以跟踪服务列表中发生的事情吗?例如,某个程序会定期拍摄服务列表的快照并显示最近发生了什么变化?这样,如果我的系统出现问题,我就知道该去哪里查找。
知道是否存在这样的事情吗?
(具体适用于 Windows 10)
答案1
我最终在 Windows 版 Bash 下创建了一个小型 PHP 脚本来完成这项工作。它调用wmic
以获取服务列表,然后将其保存在使用 git 进行版本控制的文本文件中。它在 cron 中每天调用一次。
然后我可以使用类似的东西tig
来查看随时间的变化。
如果有人有兴趣做类似的事情,这里有一个脚本(有点奇怪,但有效):
<?php
$wmicPath = '/mnt/c/Windows/System32/wbem/WMIC.exe';
$logDir = $_SERVER['HOME'] . '/var/log/win_services_mon';
@mkdir($logDir, 0755, true);
chdir($logDir);
$logFile = $logDir . '/services.log';
if (!file_exists($logDir . '/.git')) {
exec('git init');
}
exec($wmicPath . ' service get name,caption,startmode > ' . $logFile);
$content = file_get_contents($logFile);
if (strpos($content, 'ÿþ') === 0) {
$content = substr($content, 2); // Remove BOM
}
$content = str_replace("\0", '', $content); // Convert two bytes per character to one (definitely the wrong way to do this, but can't get iconv to work)
file_put_contents($logFile, $content);
exec('git add .');
exec('git commit -m "' . date('Ymd-His') . '"');
答案2
很好,但是从要求的角度来看过于复杂。
一种有效的、无需安装任何第三方软件的方法是使用批处理文件。
只需使用输出参数作为文件名+当前日期/时间运行即可wmic service get name,caption,startmode
。(即>> out20170509.log,第二天输出到 out20170510.log)。
这将创建文件。
然后,您可以使用 FC(文件之间的文件比较)对另一个 bat 文件进行任务计划,该文件本身可以输出到 cmd(暂停或延迟)或另一个您可以稍后检查的文本文件。