其实我们可以通过命令行的方式,查询系统进程来发现用户正在修改系统时间,这对于不想用户修改时间的程序来说,是一种不错的方法。以下通过Qt c++的方式来实现监视功能。
Win7系统下的实现方法:
QProcess p(0);
p.start("wmic");
p.waitForStarted();
p.write("process where caption=\"rundll32.exe\" get commandline /value");
p.closeWriteChannel();
p.waitForFinished();
QString output = p.readAllStandardOutput();
if (output.contains("timedate.cpl"))
{
QMessageBox::warning(0, tr("警告"),
tr("请不要修改系统时间,否则会出现意想不到的错误!"),
QMessageBox::Yes, QMessageBox::Yes);
}
Win10系统下的实现方法:
QProcess p(0);
p.start("wmic");
p.waitForStarted();
p.write("process where caption=\"SystemSettingsAdminFlows.exe\" get commandline /value");
p.closeWriteChannel();
p.waitForFinished();
QString output = p.readAllStandardOutput();
if (output.contains("SetDateTime"))
{
QMessageBox::warning(0, tr("警告"),
tr("请不要修改系统时间,否则会出现意想不到的错误!"),
QMessageBox::Yes, QMessageBox::Yes);
}
那么为什么这样做就可以达到目的呢,而且Win7和Win10下会有区别呢,小伙伴们不妨试试以下操作:
Win7系统下在命令行输入wmic,然后回车,会弹出一个命令行窗口
接着我们打开修改时间的窗口
然后我们在刚刚的命令行里输入我们程序里提到的命令并回车 process where caption="rundll32.exe" get commandline /value
我们就会看到如下显示:
然后我们关闭设置时间的窗口,再输入上面的命令,就会发现提示的是No Instance(s) Available.
看到这里大家应该都明白了,这个窗口可以通过上述命令查询进程及其启动参数。上面我们查询的是使用C:\Windows\system32\timedate.cpl参数启动的rundll32.exe进程,这个就是修改系统时间的窗口的进程,我们程序里面通过查询这个命令,然后匹配关键字,从而发现用户正在修改系统时间。
而Win10系统里面修改时间的窗口的进程和Win7里面是不同的,所以我们使用另一种命令和关键字匹配,Win10里面的实验步骤和Win7里面一样,这里就不再演示了。
以上就是我的解决方法,大家可以通过循环执行查询程序来达到监控的目的,希望我牺牲了几撮头发换来的思路能够帮到大家。
wmic及Win7上面的查询命令也是通过网友的博客找到的,但是我现在已经想不起来当时是怎么搜到的了,在这里要感谢这篇不知道链接的博客的启发。