Find my own process ID in VBScript

mshta terminates itself immediately. Maybe it’s too late to achieve parent process id by using WMI service.
So, I’d use something like this to eliminate concurrent script processes.

  1. Generate random things.
  2. Determine an application which could be installed on each system, never terminates by itself (e.g. command prompt with /k parameter).
  3. Start the application in hidden mode with generated random argument (WshShell.Run).
  4. Wait a few milliseconds
  5. Query the running processes by using command line argument value.
  6. Get the ParentProcessId property.
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

Leave a Comment