找回密码
 加入
搜索
查看: 2120|回复: 3

[AU3基础] [已解决]如何通过进程的可执行文件路径查到进程的PID?

[复制链接]
发表于 2015-6-10 16:24:53 | 显示全部楼层 |阅读模式
本帖最后由 smooth 于 2015-6-10 20:54 编辑

有一个文件C:\Windows\svchost.exe正在运行,进程的名字就是svchost.exe,现在想结束此进程并删除此文件。无法直接用ProcessClose("svchost.exe")来结束进程,因为系统有非常重要的同名进程svchost.exe,如果这样结束进程,则系统会强行关机。经查帮助及百度,找不到好的解决办法。有什么办法可以结束此进程并删除此文件呢?谢谢!
发表于 2015-6-10 17:24:20 | 显示全部楼层
ProcessList()
_WinAPI_GetProcessFileName()
 楼主| 发表于 2015-6-10 18:52:04 | 显示全部楼层
本帖最后由 smooth 于 2015-6-10 18:54 编辑
ProcessList()
_WinAPI_GetProcessFileName()
afan 发表于 2015-6-10 17:24


这是没办法找到我要结束的那个进程的。
下面的代码能够列出所有的进程及对应的路径,可是依然无法定位我要删除的进程,因为没有列出对应的PID号。只有根据路径及对应的PID(PID应该是唯一的,不重复的),才能准确删除进程。


#RequireAdmin

#Include <APIConstants.au3>
#Include <Array.au3>
#Include <WinAPIEx.au3>

;Opt('MustDeclareVars', 1)

Global $hToken, $aAdjust, $aList = 0

; 为获取对其他进程的完全访问权限而启用 "SeDebugPrivilege" 特权
$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)

; 为系统上所有进程获取工作目录
If Not (@error Or @extended) Then
        $aList = ProcessList()
        For $i = 1 To $aList[0][0]
                $aList[$i][1] = _WinAPI_GetProcessWorkingDirectory($aList[$i][1])
        Next
EndIf

; 默认情况下启用 SeDebugPrivilege 特权
_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
_WinAPI_CloseHandle($hToken)

_ArrayDisplay($aList, '_WinAPI_GetProcessCommandLine')
 楼主| 发表于 2015-6-10 20:53:42 | 显示全部楼层
搞定了,在上面这个例子的基础上修改了以下。

#RequireAdmin

;#Include <APIConstants.au3>
;#Include <Array.au3>
#Include <WinAPIEx.au3>

;Opt('MustDeclareVars', 1)

Global $hToken, $aAdjust, $aList = 0, $bList = [1000, 0]

; 为获取对其他进程的完全访问权限而启用 "SeDebugPrivilege" 特权
$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)

; 为系统上所有进程获取工作目录
If Not (@error Or @extended) Then
        $aList = ProcessList()
        For $i = 1 To $aList[0][0]
                
                Local $aa = $aList[$i][1], $bb
                
                $aList[$i][1] = _WinAPI_GetProcessWorkingDirectory($aa)
                
                Local $cc = $aList[$i][0]
                Local $dd = $aList[$i][1]
                
                If $cc = "svchost.exe" And $dd = @WindowsDir Then 
                        $bb = $aa
            ProcessClose($bb)
                EndIf
                
        Next
EndIf
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-27 12:30 , Processed in 0.074843 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表