gpt4 book ai didi

vbscript - 在 VBScript 中查找我自己的进程 ID

转载 作者:行者123 更新时间:2023-12-02 17:16:41 25 4
gpt4 key购买 nike

我使用以下代码片段来确定我的 vbscript 运行的进程 ID:

On Error Resume Next
Dim iMyPID : iMyPID = GetObject("winmgmts:root\cimv2").Get("Win32_Process.Handle='" & CreateObject("WScript.Shell").Exec("mshta.exe").ProcessID & "'").ParentProcessId
If Err.Number <> 0 Then Call Handle_Error(Err.Description)
On Error Goto 0

在我的 Windows 7(32 位)计算机上,该方法在大约 90% 的时间内有效,并且 iMyPID 包含当前正在运行的脚本的进程 ID。但是,有 10% 的情况下 Handle_Error 会被调用,并显示错误消息“SWbemServicesEX:未找到”。

最近,运行 Windows 7(64 位)的其他人报告说,Handle_Error 总是被调用,并显示错误消息“内存不足”。这似乎是一个疯狂的错误消息,只是为了找出您自己的进程 ID!

有人可以推荐更好的方法吗?

最佳答案

mshta 立即终止。也许现在使用 WMI 服务获取父进程 ID 已经太晚了。
因此,我会使用类似的方法来消除并发脚本进程。

  1. 生成随机的东西。
  2. 确定一个可以安装在每个系统上的应用程序,并且永远不会自行终止(例如带有/k 参数的命令提示符)。
  3. 使用生成的随机参数 ( WshShell.Run ) 以隐藏模式启动应用程序。
  4. 等待几毫秒
  5. 使用命令行参数值查询正在运行的进程。
  6. 获取 ParentProcessId 属性。
Function CurrProcessId
Dim oShell, sCmd, oWMI, oChldPrcs, oCols, lOut
lOut = 0
Set oShell = CreateObject("WScript.Shell")
Set oWMI = GetObject(_
"winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
sCmd = "/K " & Left(CreateObject("Scriptlet.TypeLib").Guid, 38)
oShell.Run "%comspec% " & sCmd, 0
WScript.Sleep 100 'For healthier skin, get some sleep
Set oChldPrcs = oWMI.ExecQuery(_
"Select * From Win32_Process Where CommandLine Like '%" & sCmd & "'",,32)
For Each oCols In oChldPrcs
lOut = oCols.ParentProcessId 'get parent
oCols.Terminate 'process terminated
Exit For
Next
CurrProcessId = lOut
End Function

Dim ProcessId
ProcessId = CurrProcessId 'will remain valid indefinitely

WScript.Echo ProcessId

关于vbscript - 在 VBScript 中查找我自己的进程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8296037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com