防止 wmic.exe 写入 TempWmicBatchFile.bat

Posted

技术标签:

【中文标题】防止 wmic.exe 写入 TempWmicBatchFile.bat【英文标题】:Prevent wmic.exe from writing TempWmicBatchFile.bat 【发布时间】:2012-09-12 15:30:53 【问题描述】:

我想在我的 Java 应用程序中检查 Windows 虚拟键盘是否已经在运行。

我搜索了一下,发现可以使用wmic.exe来搜索进程。

这就是我正在做的:

Process proc = Runtime.getRuntime().exec("wmic.exe");
BufferedReader input = new BufferedReader(new InputStreamReader(proc
    .getInputStream()));
OutputStreamWriter oStream = new OutputStreamWriter(proc
    .getOutputStream());
oStream .write("process where name='osk.exe' get caption");
oStream .flush();
oStream .close();
input.readLine();
while ((in = input.readLine()) != null) 
    if (in.contains("osk.exe")) 
        input.close();
        proc.destroy();
        return;
    

input.close();
proc.destroy();

这是可行的,但wmic 以某种方式创建文件TempWmicBatchFile.bat 与行process where name='osk.exe' get caption

我怎样才能防止这种情况发生?

【问题讨论】:

【参考方案1】:

您可以避免打开其他流来传递另一个命令。这就是创建临时 bat 文件的原因。

使用下面的代码。它不会创建临时批处理文件

public class WmicTest 

    public static void main(String[] args) throws IOException 

        Process proc = Runtime.getRuntime().exec("wmic.exe process where name='osk.exe' get caption");
        BufferedReader input = new BufferedReader(new InputStreamReader(proc
                .getInputStream()));
//        OutputStreamWriter oStream = new OutputStreamWriter(proc
//                .getOutputStream());
//        oStream.write("process where name='osk.exe' get caption");
//        oStream.flush();
 //       oStream.close();
        input.readLine();
        String in;
        while ((in = input.readLine()) != null) 
            if (in.contains("osk.exe")) 
                System.out.println("Found");
                input.close();
                proc.destroy();
                return;
            
        
        input.close();
        proc.destroy();
    

【讨论】:

完美!正是我想要的:)

以上是关于防止 wmic.exe 写入 TempWmicBatchFile.bat的主要内容,如果未能解决你的问题,请参考以下文章

wmic.exe的三、简单的使用实例

wmic

使用wmic.exe绕过应用程序白名单(多种方法)

wmic命令用法小例

如何使用 WMIC 从远程服务器启动应用程序

已知进程ID,如何获取进程名称 以及路径。