'Desc: loguea los eventos de creacion de procesos ' Este script esta pensado para EJECUTARSE CONTINUAMENTE, perdurando entre logins Y Logouts ' Una vez que se inicia solo se detenice ejecutando pararEventSystem.vbs o claro, con un kill ubicado en el directorio "inicio"; tipicamente ' Corre como Local System. ' Para detenerlo ejecute el script pararEventSystem.vbs ' SE DEBE SERTEAR LA VARIABLE pathLog Y POSIBLEMENTE pathPsexec ' ESTE SCRIPT SE EJECUTA COMO LOCAL SYSTEM Y SOBREVIVE A LOGINS Y LOGOUTS. DEPENDE EN ' QUE PSEXEC ESTE INSTALADO EN EL SISTEMA Y DENTRO DEL PATH DE EJECUTABLES O ESPECIFICADO 'EN pathPsexec. '-----------------------------------CAMBIAR ------------------------------------------ 'debe ser un path abxoluto; si relativo creo que lo toma con respecto a C\Windows; lo sig resuleve al mismo dir que el script pathLog = Left(Wscript.ScriptFullName,InStrRev(Wscript.ScriptFullName,"\")) & _ "log-de-proc-system.txt" '----------------------------------------------------------------------------------------- '------------CAMBIAR SI NECESARIO----------------------' 'solo necesario si psexec el path del sistema. Si se setea el path es NECESARIO poner el "\" final 'ejemplo: 'pathPsexec="C:\Archivos de programa\Sysinternals\PsTools\" pathPsexec="" ' debe verificar la cantidades de argumentos; si ejecutado con 0 se ejecuta a si mismo con psexec y un argumento "System" ' si recibe un argumento asume que ya esta corriendo como sistema psexec=chr(34) & pathPsexec & "psexec" & chr(34) If WScript.Arguments.Count = 0 Then Set Sgh=WScript.CreateObject("WScript.Shell") Sgh.run("psexec -i -s -d wscript.exe " & chr(34) _ & WScript.ScriptFullName & chr(34) & " System") WScript.Quit(0) End If 'en este punto se debe estar ejecutando como local system ' verifica si no hay otra instancia de si mismo ya se esta ejecutando; si es asi sale ' lo logico es que haya una sola instancia de este logger If existeOtraIns() Then temp = MsgBox("Ya existe otra instancia de este script corriendo", vbOkOnly ,"Error") WScript.Quit(0) End If strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") '--------------------nuevo----------------------- Set objFileSystem = CreateObject("Scripting.fileSystemObject") Set objOutputFile = objFileSystem.openTextFile(pathLog,8, TRUE) '-------------------- procesos iniciales --------------------------------------- objOutputFile.WriteLine(vbCrLf & vbCrLf & _ "------------ Procesos Iniciales(como Local System) " & Now & " -------------" & vbCrLf & _ "Creacion(y/m/d h:m:s) PID PPID Nombre Linea de comando Path al ejecutable ") Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process") procIni = "" for each Process in colProcesses procIni = procIni & _ formatDateTime(Process.CreationDate)&" "& Process.ProcessId & _ vbTab & Process.ParentProcessId & vbTab & _ Process.Name & vbTab & Process.CommandLine & vbTab & _ Process.ExecutablePath & vbCrLf Next objOutputFile.WriteLine( procIni ) '------------------- comienzo de logeo de nuevos procesos ---------------------------------- objOutputFile.WriteLine(vbCrLf & vbCrLf & _ "------------ Comienzo de logeo(como Local System) " & Now & " -------------" & vbCrLf & _ "Creacion(y/m/d h:m:s) PID PPID Nombre Linea de comando Path al ejecutable ") Set colMonitoredProcesses = objWMIService. _ ExecNotificationQuery("select * from __instancecreationevent " _ & " within 1 where TargetInstance isa 'Win32_Process'") Do While true Set Process = colMonitoredProcesses.NextEvent objOutputFile.WriteLine( _ formatDateTime(Process.TargetInstance.CreationDate)&" " & _ Process.TargetInstance.ProcessId & _ vbTab & Process.TargetInstance.ParentProcessId & vbTab & _ Process.TargetInstance.Name & vbTab & _ Process.TargetInstance.CommandLine & vbTab & _ Process.TargetInstance.ExecutablePath ) if InStr(Process.TargetInstance.CommandLine,"pararEventSystem.vbs")<>0 Then ' esto anda -> Process.TargetInstance.Terminate() objOutputFile.WriteLine("Encontrado pararEventSystem.vbs!!! Finalizando logeo...") MsgBox("Saliendo del logeador de creacion de procesos (como usuario)" & vbCrLf & _ "logs en " & pathLog ) WScript.Quit(0) end if Loop function formatDateTime(s) 'yyyy/mm/dd hh:mm:ss o " no se aplica " if trim(s)="" or IsNull(s) then formatDateTime=" No se aplica " else s=trim(s) formatDateTime=Left(s,4)&"/"& Mid(s,5,2)&"/"&Mid(s,7,2)&" "& _ Mid(s,9,2)&":"&Mid(s,11,2)&":"&Mid(s,13,2) end if end function ' debe haber formas mas elegantes Function existeOtraIns() Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2") cantIns=0 For each Process in objWMIService.InstancesOf("Win32_process") if InStr(Process.CommandLine, Wscript.ScriptName) <> 0 Then cantIns= cantIns +1 ' exit for.... end if Next if cantIns >= 2 then existeOtraIns=true else existeOtraIns=false end if ' MsgBox("existeOtraIns encontro:" & cantIns & " instancias de este script") End Function