WMIC + Python 子进程/ (Windows 10)

Posted

技术标签:

【中文标题】WMIC + Python 子进程/ (Windows 10)【英文标题】:WMIC + Python Subprocess/ (Windows 10) 【发布时间】:2020-11-15 19:00:24 【问题描述】:

我正在尝试使用 subprocess.Popen 杀死一个 .exe。

解决方案为:

    taskkill /im (.exe) /t /f taskkill /pid (.exe) /t /f

无法正常工作,因为响应被拒绝访问。事实上,当我从子进程运行 cmd 时,我无法获得管理员权限。

我找到了一个从 cmd 中杀死这个进程的命令(不以管理员身份运行),它是:

    wmic process where name=".exe" 删除

...但是当我使用子进程运行它时,它给了我“无效查询”。 我正在运行的命令是:

4)subprocess.Popen(['wmic', 'process', 'where', 'name="-------.exe"', 'delete'], shell=True, stdout=subprocess .管道)

我想我写错了。有什么建议吗?

【问题讨论】:

尝试删除文件名周围的引号,因为无论如何您都在此处指定单独的参数。这行得通吗? 听起来像是一些奇怪的逃避不兼容...在黑暗中拍摄,可能不是最好的解决方案:['cmd', '/c', 'wmic process where name="open***.exe" delete'] 或者只是将整个事情作为字符串传递:subprocess.popen('wmic process where name="open***.exe" delete') 接下来我要做的是使用Process Monitor 来查看实际上传递给 wmic 的命令行(将过滤器设置为“操作”“以”“进程”开头)并将其与您从 cmd 工作时的外观进行比较。这可能会提供有关问题所在的线索。 哦,酷。在这种情况下,如果您能针对自己的问题写一个答案,那就太好了,这样未来的读者也可以找到解决方案!您以后也可以自行接受答案。 您不应将参数列表与shell=True 混合使用;它有时会以奇怪的方式工作,但基本上总是一个错误。另见***.com/questions/3172470/… 【参考方案1】:

解决方案是在比较运算符周围放置空格并将整个条件(name = xxxname like xxx)作为单个参数发送,因为 wmic 不喜欢将其分成几部分,并且在内部引号会弄乱如果它们位于单词的“中间”,则向上:

subprocess.Popen(['wmic', 'process', 'where', 'name like "----.exe"', 'delete'], shell=True)

【讨论】:

实际上 shell=False 和 shell=True 都有效。我是新手,不知道 shell=True 可能引起的并发症。有什么解释吗?例如,当我使用子进程的正确命令启动 .exe 时,它​​需要 shell=True 否则会发生错误。相反,当使用 wmic if shell =False 时,不会出现错误。 我的其他评论有一个指向更多信息的链接。基本上,这目前恰好适用于 Windows,但这并不意味着它是正确的;一旦你阅读了链接页面,你应该很清楚为什么不这样做。 它是“wmic.exe”,而不是wmic shell 命令,并且您没有使用任何 shell 命令行功能,例如环境变量扩展或标准 I/O 重定向和管道,所以在这里使用shell=True 是没有意义的。 此命令仅适用于 Windows,因此无需担心 wmic.exe 是否与subprocess.list2cmdline 中的假设兼容。实际上,wmic.exe 调用GetCommandLineW 并手动解析其命令行,而不是使用C argvCommandLineToArgvW,因此与将参数作为列表传递可以预见的兼容并不是一种正常情况。只需使用命令行字符串,例如subprocess.call('wmic.exe process where "name like "----.exe"" delete'). 更简单地说,通过 PID 通过os.kill(pid, signal.SIGTERM) 终止进程。在 Windows 中,这是通过 TerminateProcess(hProcess, SIGTERM) 实现的,它将退出状态设置为 SIGTERM (15)。这不是 Windows 中有意义的退出状态,但很好。通常在 Windows 中,终止进程的退出状态设置为 1,但 os.kill 写得非常糟糕,并将其与尝试将 CTRL_BREAK_EVENT (1) 发送到控制台组混为一谈,给定 ID 被解释为控制台进程组标识。仅当它实际上是您发送 Ctrl+Break 的控制台进程组时才执行此操作。

以上是关于WMIC + Python 子进程/ (Windows 10)的主要内容,如果未能解决你的问题,请参考以下文章

wmic 进程空的可执行路径

使用 wmic 命令查找前 10 个进程

Taskkill 使用 WMIC 和环境变量存在于特定路径中的进程

[Windows]查看运行进程的参数wmic

WMIC常用

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