Excel Run Exe Taskm
Excel Run Exe Taskm
Option VBASupport 1
' TaskManager.xls v0.1.0
' Non-exhaustive list of sources:
' http://www.ex-designz.net/apidetail.asp?api_id=351
' http://www.xtremevbtalk.com/archive/index.php/t-248755.html
' http://msdn.microsoft.com/en-us/library/ms684335%28v=vs.85%29.aspx
'
' http://didierstevens.com
' Use at your own risk
'
' Shortcommings, or todo's ;-)
'
' History:
' 2011/02/02: start
' 2011/02/04: v0.0.2 added GetTimes
' 2011/02/21: v0.0.3 added GetType
' 2011/02/22: added GetProcessFilename
' 2011/02/23: added AdjustTokenForDebug
' 2011/10/09: v0.1.0 added support for 64-bit Excel
Option Explicit
GetProcessOwner = ""
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, lProcessID)
If hProcess <> 0 Then
If OpenProcessToken(hProcess, TOKEN_QUERY, hToken) <> 0 Then
GetTokenInformation hToken, TokenUser, 0, 0, lNeeded
ReDim abBuffer(0 To CLng(lNeeded))
If GetTokenInformation(hToken, TokenUser, abBuffer(0), UBound(abBuffer), lNeeded) = 1 Then
CopyMemory lpSid, abBuffer(0), 4
strAccountName = Space(MAX_PATH)
strDomainName = Space(MAX_PATH)
lAccountName = MAX_PATH
lDomainName = MAX_PATH
If LookupAccountSid(vbNullString, lpSid, strAccountName, lAccountName, strDomainName,
lDomainName, peUse) <> 0 Then
If strDomainName = "" Then
GetProcessOwner = Left(strAccountName, CLng(lAccountName))
Else
GetProcessOwner = Left(strDomainName, CLng(lDomainName)) & "\" &
Left(strAccountName, CLng(lAccountName))
End If
End If
End If
Call CloseHandle(hToken)
End If
CloseHandle hProcess
End If
End Function
GetTimes = ""
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, lProcessID)
If hProcess <> 0 Then
If GetProcessTimes(hProcess, sFTCreation, sFTDummy, sFTDummy, sFTDummy) <> 0 Then
If FileTimeToLocalFileTime(sFTCreation, sFTCreationLocal) <> 0 Then
If FileTimeToSystemTime(sFTCreationLocal, sSTCreation) <> 0 Then
GetTimes = CStr(sSTCreation.wYear) + "/" + CStr(sSTCreation.wMonth) + "/" +
CStr(sSTCreation.wDay) + " " + CStr(sSTCreation.wHour) + ":" + CStr(sSTCreation.wMinute) + ":" +
CStr(sSTCreation.wSecond)
End If
End If
End If
CloseHandle hProcess
End If
End Function
GetType = ""
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, lProcessID)
If hProcess <> 0 Then
If IsWow64Process(hProcess, lWoW64) Then
GetNativeSystemInfo sSI
GetType = IIf(sSI.wProcessorArchitecture > 0 And lWoW64 = 0, "64", "32")
End If
CloseHandle hProcess
End If
End Function
Device2DriveFilename = strFilename
For Each varKeyDevice In dicDevices.Keys
If StartsWith(strFilename, varKeyDevice) Then
Device2DriveFilename = dicDevices(varKeyDevice) & Mid(strFilename, Len(varKeyDevice) + 1)
End If
Next
End Function
GetProcessFilename = ""
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lProcessID)
If hProcess <> 0 Then
strBuffer = Space(MAX_PATH)
Err.Clear
On Error Resume Next
lLength = GetProcessImageFileName(hProcess, strBuffer, Len(strBuffer))
If Err.Number = 453 Then
lLength = K32GetProcessImageFileName(hProcess, strBuffer, Len(strBuffer))
End If
On Error GoTo 0
GetProcessFilename = Device2DriveFilename(Left(strBuffer, CLng(lLength)))
CloseHandle hProcess
End If
End Function
AdjustTokenForDebug
iIter = oCell.Row
iColumn = oCell.Column
Do While lRet
iPositionNull = InStr(1, sPE32.szExeFile, Chr(0))
If iPositionNull > 0 Then
strProcess = Left(sPE32.szExeFile, iPositionNull - 1)
Else
strProcess = ""
End If
Cells(iIter, iColumn).Value = strProcess
Cells(iIter, iColumn + 1).Value = sPE32.th32ProcessID
Cells(iIter, iColumn + 2).Value = GetProcessFilename(sPE32.th32ProcessID)
Cells(iIter, iColumn + 3).Value = GetProcessOwner(sPE32.th32ProcessID)
Cells(iIter, iColumn + 4).Value = GetTimes(sPE32.th32ProcessID)
Cells(iIter, iColumn + 5).Value = GetType(sPE32.th32ProcessID)
iIter = iIter + 1
lRet = Process32Next(hSnapshot, sPE32)
Loop
CloseHandle hSnapshot
End If
End Sub
Do While lRet
If sTE32.rh32OwnerProcessID = lProcessID Then
hThread = OpenThread(THREAD_SUSPEND_RESUME, False, sTE32.th32ThreadID)
If hThread <> 0 Then
If bSuspend Then
SuspendThread hThread
Else
ResumeThread hThread
End If
CloseHandle hThread
End If
End If
lRet = Thread32Next(hSnapshot, sTE32)
Loop
CloseHandle hSnapshot
End If
End Sub
AdjustTokenForDebug
iIter = oCell.Row
iColumn = oCell.Column
Do While Cells(iIter, iColumn + 1).Value <> ""
Select Case LCase(Cells(iIter, iColumn).Value)
Case "t":
TerminateProcessByID Cells(iIter, iColumn + 2).Value
Case "s":
SuspendProcessByID Cells(iIter, iColumn + 2).Value, True
Case "r":
SuspendProcessByID Cells(iIter, iColumn + 2).Value, False
End Select
iIter = iIter + 1
Loop
End Sub
End Sub
Sub MacroProcessList()
Range("A7:G65000").ClearContents
Set dicDevices = GetDevices()
ProcessListToSheet Range("B7")
Range("A6:G65000").Sort "Process executable", xlAscending, header:=xlYes
End Sub
Sub MacroExecuteCommands()
ExecuteCommands Range("A7")
End Sub