Home
Windows Management Instrumentation: amministrare l’OS Windows (Parte terza)

25 Novembre 2005

Windows Management Instrumentation: amministrare l’OS Windows (Parte terza)

di

Utilizzando l’ambiente WMI (Windows Management Instrumentation) vedremo come visualizzare le informazioni dei processi e dei threads in esecuzione su uno o più computer

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 Process ntaskldr.exe is owned by Process IEXPLORE.EXE is owned by Process pcsws.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

L'autore

Iscriviti alla newsletter

Novità, promozioni e approfondimenti per imparare sempre qualcosa di nuovo

Gli argomenti che mi interessano:
Iscrivendomi dichiaro di aver preso visione dell’Informativa fornita ai sensi dell'art. 13 e 14 del Regolamento Europeo EU 679/2016.