Il proprietario di un processo
Lo script che segue visualizza il proprietario di ogni processo presente su uno o più computer utilizzando la classe Win32_Process.
strComputer = “.” Set objWMIService = GetObject(“winmgmts:” _ & “{impersonationLevel=impersonate}!\” & strComputer & “rootcimv2”) Set colProcessList = objWMIService.ExecQuery _ (“SELECT * FROM Win32_Process”) For Each objProcess in colProcessList colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain) Wscript.Echo “Process ” & objProcess.Name & ” is owned by ” _ & strUserDomain & “” & strNameOfUser Next
Eseguendo lo script si ottiene un report simile al seguente:
Process explorer.exe is owned by
Viene visualizzato il nome del processo, il dominio windows e l’utente proprietario(utente che ha attivato il processo).
Monitor dei threads
Ricordo che un processo occupa una determinata quantità di memoria separata dagli altri processi. I thread di un processo condividono la memoria del processo a cui sono associati.
Set objDictionary = CreateObject(“Scripting.Dictionary”) strComputer = “.” Set objWMIService = GetObject(“winmgmts:” _ & “{impersonationLevel=impersonate}!\” & strComputer & “rootcimv2”) Set colProcesses = objWMIService.ExecQuery _ (“SELECT * FROM Win32_Process”) For Each objProcess in colProcesses objDictionary.Add objProcess.ProcessID, objProcess.Name Next Set colThreads = objWMIService.ExecQuery _ (“SELECT * FROM Win32_Thread”) For Each objThread in colThreads intProcessID = CInt(objThread.ProcessHandle) strProcessName = objDictionary.Item(intProcessID) Wscript.Echo strProcessName & VbTab & objThread.ProcessHandle & _ VbTab & objThread.Handle & VbTab & objThread.ThreadState Next
Per ogni processo trovato vengono aggiunti al dizionario ProcessID e (process)name.
For Each objProcess in colProcesses objDictionary.Add objProcess.ProcessID, objProcess.Name Next
Dopo questa operazione il dizionario potrebbe contenere:
Proces Name ProcessID SMSS 140 CSRSS 164 Winlogon 184
Con il metodo ExecQuery otteniamo la lista dei threads attivi in “macchina”, attraverso la classe Win32_Thread.
Set colThreads = objWMIService.ExecQuery _ (“SELECT * FROM Win32_Thread”)
Per ogni threads si cerca il suo ProcessHandle che rappresenta il ProcessId del processo che lo ha creato.
For Each objThread in colThreads intProcessID = CInt(objThread.ProcessHandle)
Questo è necessario perché la classe Win32_Threadcontiene solamente l’id del thread e non il nome del processo che l’ha creato.
Dopo questa operazione la situazione potrebbe essere la seguente:
ProcessID Thread 140 144 140 148 140 92 140 156 140 152
L’istruzione strProcessName = objDictionary.Item(intProcessID) serve per fare l’associazione ProcessId e process name e thread.
Eseguendo lo script si ottiene un report simile al seguente dove vengono visualizzati il nome del processo, il numero del processo ed i suoi threads.
Process name ProcessID Thread SMSS.EXE 140 136 SMSS.EXE 140 144 SMSS.EXE 140 148 SMSS.EXE 140 92 SMSS.EXE 140 156 SMSS.EXE 140 152 CSRSS.EXE 164 168 CSRSS.EXE 164 172 CSRSS.EXE 164 176 CSRSS.EXE 164 180 CSRSS.EXE 164 128 CSRSS.EXE 164 188 CSRSS.EXE 164 192 CSRSS.EXE 164 228 CSRSS.EXE 164 1152 CSRSS.EXE 164 1156 5 WINLOGON.EXE 184 160 5 WINLOGON.EXE 184 200 5 WINLOGON.EXE 184 204 5 WINLOGON.EXE 184 216 5 WINLOGON.EXE 184 260 5 WINLOGON.EXE 184 556 5 WINLOGON.EXE 184 1092 5…………
Start di un processo
Lo script che segue crea un processo in un computer remoto utilizzando la classe Win32_Process.
strComputer = “server-web” Set objWMIService = GetObject(“winmgmts:” _ & “{impersonationLevel=impersonate}!\” & strComputer & _ “rootcimv2:Win32_Process”) errReturn = objWMIService.Create(“webserver.exe”, null, null, intProcessID) If errReturn = 0 Then Wscript.Echo “Webserver was started with a process ID of ” _ & intProcessID & “.” Else Wscript.Echo “Webserver could not be started due to error ” & _ errReturn & “.” End If
L’istruzione strComputer = “server-web” indica allo script che tutte le operazioni che seguono devono essere eseguite sul computer server-web.
L’istruzione errReturn = objWMIService.Create(“webserver.exe”, null, null, intProcessID)crea il processo sul computer remoto.
- “webserver.exe” è il programma da eseguire
- Il secondo campo serve per specificare la directory di partenza del processo. Nel nostro caso il parametro null indica che la directory di partenza del processo è quella da cui si esegue lo script.
- Il terzo campo serve per specificare le opzioni di partenza del processo(alta,bassa o media priorità,….). Nel nostro caso il parametro null indica che non ci sono opzioni di partenza.
- Il quarto campo indica che se il metodo create è andato a buon fine la variabile intProcessId contiene il valore del process ID.
Stop di un processo
Lo script che segue arresta il processo webserver.exe attivo sul computer server-web.
strComputer = “server-web” Set objWMIService = GetObject(“winmgmts:” _ & “{impersonationLevel=impersonate}!\” & strComputer & “rootcimv2”) Set colProcessList = objWMIService.ExecQuery _ (“SELECT * FROM Win32_Process WHERE Name = ‘webserver.exe'”) For Each objProcess in colProcessList objProcess.Terminate() Next