【问题标题】:WMIC ignores %SystemRoot% during selective process terminationWMIC 在选择性进程终止期间忽略 %SystemRoot%
【发布时间】:2019-12-07 13:28:38
【问题描述】:

WMIC 似乎有自己的 Windows 文件夹变量,并且完全忽略了我的系统列出的变量(使用 set)。我正在运行的命令是 wmic process where "not executablepath like '%%systemroot%%'" delete 来杀死从 Windows 文件夹以外的任何地方运行的所有进程。如果我使用%%systemroot%% 或相同的%%windir%%,程序会提前运行并终止其权限范围内的每个正在运行的进程,无论位置如何。出于某种原因,正如我在网上看到的那样,WMIC 处理变量 %%windows%% 并将使用它正确执行,但 %%windows%% 甚至不是我系统下列出的变量。

【问题讨论】:

    标签: windows batch-file wmi wmic


    【解决方案1】:

    开始,您需要将% 通配符加倍,但不是那些包含变量名的字符,因此您需要%SystemRoot%,但您还需要通配符%%。由于%SystemRoot% 的值始终是完全限定路径,因此您只需在其后添加通配符即可。此外, 要求路径使用双反斜杠,因此您需要执行子字符串替换 %SystemRoot:\=\\%。同样重要的是要注意,有许多进程往往不携带ExecutablePath 值,因此首先将它们过滤掉是明智的。最后,你需要的命令是Terminate不是Delete

    综上所述,我建议您使用:

    @"%__AppDir__%wbem\WMIC.exe" Process Where "ExecutablePath Is Not Null And Not ExecutablePath Like '%SystemRoot:\=\\%\\%%'" Call Terminate
    

    【讨论】:

    • 显然如果您想在尝试此解决方案之前检查将终止的内容,您可以暂时将 Call Terminate 替换为 Get ExecutablePath & Pause
    • 感谢您的回复。从我读过的所有内容来看,删除 = 呼叫终止。两者都给出“无效查询”。 .当您说“%通配符”时,我不确定您的意思……这是正确的术语吗?我不跟。 .我之前有使用 %windows% 的 wmic,但是在我的常规 win7 系统和干净的 win7 虚拟机中,它在运行时都会导致 BSOD。使用 %%windows%% 以某种方式解决了这个问题并运行得很好。奇怪的是,wmic 中没有双精度的 %SystemRoot% 不会蓝屏,但它会忽略路径并杀死所有进程。 .使用“C:\\Windows”会忽略路径。 .似乎无法用谷歌搜索到底 :\=\\ 做了什么
    • 我告诉过你它是什么,它是一个子字符串替换,我将扩展变量值中的 \ 替换为 \\ 。我会提到我上面提供的示例行必须从batch-file 运行,而不是command-prompt
    • 另外,请注意某些进程可能不会为任何用户终止。
    • @jseas,我告诉过你,这是一个通配符。如果我给你看这个,C:\Windows\System32\*,你知道这是什么意思吗?在 WMIC 的 Like 命令中,它是 C:\\Windows\\System32\\%,因为您是从 batch-file 运行它,所以 % 需要加倍,C:\\Windows\\System32\\%%
    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2014-06-13
    • 2017-03-04
    相关资源
    最近更新 更多