'Script para ver y matar procesos de una maquina (local o remoto)
'
'Util sobre todo en maquinas que tiene deshabilitado el administrador de tareas o taskmanager
'
'Visualiza todos los procesos por orden alfabetico
'Permite matar procesos por su ID o por nombre e cuyo caso se pueden matar multiples procesos
'
'
'31/5/2007 por Victor Soler Vinyuelas

dim maquina, nombre, proceso

maquina = inputbox("Dim la direccion IP de la maquina que quieres ver los procesos (. para esta)")

if maquina = "" then 
	maquina = "."	'esta maquina
else
	maquina = maquina	'otra maquina
end if
call VerProcesos(maquina,"")

if msgbox("¿¿Quieres matar algun proceso de los que has visto?", vbyesno) = vbyes then 
	do until respuesta <> ""
		respuesta = inputbox("1. Matar por ID del proceso (se mata un unico proceso)" & vbcrlf & "2. Matar por nombre (se pueden matar multiples procesos)" & vbcrlf & "0. Cancelar")
		if respuesta <> "1" and respuesta <>"2" and respuesta <>"0" then respuesta = ""
	loop
	
	if respuesta = "1" then
		nombre = inputbox("Escribe el ID del proceso que quieres matar: ")
		if nombre <> "" then
			call Matar_ProcesoID(maquina, nombre)
		end if
	elseif respuesta = "2" then
		nombre = inputbox("Escribe el proceso igual que lo has visto: ")
		if nombre <> "" then
			call Matar_Procesos(maquina, nombre)
		end if
	end if
end if
msgbox "SCRIPT FINALIZADO"

Function VerProcesos (maquina, nombreproceso)
	dim objWMIService
	dim colItems
	dim objItem
	dim cad
	dim proceso
	dim objShell
	dim n
	dim procesos()
	dim pids()

	if nombreproceso = "" then 
		nombreproceso = "*"
	else
		nombreproceso = "'" & nombreproceso & "'"
	end if

'	Set objWMIService = GetObject("winmgmts:\\" & maquina & "\root\cimv2")
	Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & maquina & "\root\cimv2")
	if nombreproceso = "*" then
		Set colItems = objWMIService.ExecQuery ("Select * From Win32_Process")
	else
		Set colItems = objWMIService.ExecQuery ("Select * From Win32_Process Where Name = " & nombreproceso )
	end if

	'Cargo la matriz de pids y procesos
	redim pids(colItems.Count)
	redim procesos(colItems.Count)
	i = 0
	For Each objItem in colItems
		procesos(i) = objItem.Name
		pids(i) = objItem.ProcessID
		i = i+1
	Next

	'Ordeno por nombre (tambien se podria hacer por PID)
	for i = 0 to colItems.Count -1
		for j = i+1 to colItems.Count
			if Ucase(procesos(i)) > Ucase(procesos(j)) then
				aux = procesos(i)
				procesos(i) = procesos(j)
				procesos(j) = aux
				aux = pids(i)
				pids(i) = pids(j)
				pids(j) = aux
			end if
		next
	next

	'Y visualizo
	veces = 0
	conta = 0
	cad = "PROGRAMA" & vbtab & vbtab & "PID" & vbcrlf & "-----------------"
	for i = 0 to colItems.Count
		cad = cad & vbcrlf & procesos(i)
		n = len(procesos(i))
		if n < 8 then
			cad = cad & vbtab & vbtab & vbtab
		elseif n >= 8 and n < 18 then
			cad = cad & vbtab & vbtab
		else
			cad = cad & vbtab
		end if
		cad = cad & pids(i)
		conta = conta + 1
		if conta = 15 or i = colItems.Count  then 
			veces = veces + 1
			cad = cad & vbcrlf & "-----------------" & vbcrlf  & "Total de Procesos: " & colItems.Count + 1
			cad = cad & vbcrlf & vbcrlf & vbtab & vbtab & "Pagina  " & veces
			msgbox cad,vbokonly,"Lista de Procesos"
			cad = "PROGRAMA" & vbtab & vbtab & "PID" & vbcrlf & "-----------------"
			conta = 0
		end if
	Next




End Function

Function Matar_Procesos(maquina, NombreProceso)
	dim strComputer
	dim objWMIService
	dim Procesos
	dim Proceso
	dim i

	if msgbox("¿Seguro que quieres matar los procesos " & NombreProceso & " ?", vbyesno, "Matar Procesos") = vbyes then
		strComputer = maquina
'		Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

		Set Procesos = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & NombreProceso & "'")
		i=0
		For Each Proceso in Procesos
		    Proceso.Terminate()
			i = i + 1
		Next
		msgbox "Se han matado " & i & " procesos.", vbokonly, "Resultado"
	else
		msgbox "Se ha cancelado la operacion de matar procesos.", vbokonly
	end if
End Function

Function Matar_ProcesoID(maquina, ID)
	dim strComputer
	dim objWMIService
	dim Procesos
	dim Proceso
	dim i

	if msgbox("¿Seguro que quieres matar el proceso " & ID & " ?", vbyesno, "Matar Proceso") = vbyes then
		strComputer = maquina
'		Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

		Set Procesos = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessID = " & ID)
		i=0
		For Each Proceso in Procesos
		    Proceso.Terminate()
			i = i + 1
		Next
		msgbox "Se han matado " & i & " procesos.", vbokonly, "Resultado"
	else
		msgbox "Se ha cancelado la operacion de matar procesos.", vbokonly
	end if
End Function

