Script de inicio deja archivo .txt abierto

02/06/2009 - 04:34 por Eduardo Ceh | Informe spam
Buenas noches.
No se si este es el foro para esta pregunta pero ahi les va, cree un script
.vbs de inicio de sesión que recoge información de la maquina, el usuario y
la version del DAT del antivirus y esta información la guarda en un .TXT en
una carpeta compartida en un servidor para su posterior analisis.

El detalle es que me he topado con 2-3 equipos/usuario que al ejecutar el
script dejan el archivo de texto abierto y por consiguiente nadie que se
valide posteriormente puede escribir su información hasta que voy al
servidor y cierro el archivo abierto.Antes de que se validen funciona al 100
% y despues de desbloquear el archivo igual funciona al 100%

Alguin sabrá porque puede producirse este comportamiento?? lo estoy probando
un una OU con 40 usuarios, pero la idea es ejecutarlo en todo el dominio con
unos 5,000 usuarios.

Les copio el script.

'1- PRIMERO DETECTO SI ES WINDOWS DE 32 O DE 64 BITS

On Error Resume Next

Const ForAppending = 8
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")
sComputerName = objWshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
sUsername = objWshShell.ExpandEnvironmentStrings("%USERNAME%")
sLogonServer = objWshShell.ExpandEnvironmentStrings("%LOGONSERVER%")


RutaEngine = "McAfee\Engine"
DatFile = "avvscan.dat"


' Ruta del registro donde se ve si es de 32 o de 64 Bits
X = objWshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session
Manager\Environment\PROCESSOR_ARCHITECTURE")

'PREPARO TODAS LAS VARIABLES PARA UTILIZARLAS EN LA VALIDACION POSTERIOR (2)
If X = "x86" Then '1er IF
'SI es de 32 bits
'Declaro las variables de entorno de 32 Bits
'wscript.echo "Es un sistema operativo de 32 Bits"
sProgramFile = objWshShell.ExpandEnvironmentStrings("%PROGRAMFILES%") & "\"
sComProgramFile =
objWshShell.ExpandEnvironmentStrings("%COMMONPROGRAMFILES%") & "\"
'wscript.echo sProgramfile
'wscript.echo sComProgramFile

sRutaEngine = sComProgramFile & RutaEngine
'wscript.echo sRutaEngine

sRutaDatFile = sRutaEngine & "\" &DatFile
'wscript.echo sRutaDatFile

Else '1er IF
'SI es de 64 bits
'Declaro las variables de entorno de 64 Bits
'wscript.echo "Es un sistema operativo de 64 Bits"
sProgramFile = objWshShell.ExpandEnvironmentStrings("%PROGRAMFILES(X86)%") &
"\"
sComProgramFile =
objWshShell.ExpandEnvironmentStrings("%COMMONPROGRAMFILES(X86)%") & "\"
'wscript.echo sProgramfile
'wscript.echo sComProgramFile

sRutaEngine = sComProgramFile & RutaEngine
'wscript.echo sRutaEngine

sRutaDatFile = sRutaEngine & DatFile
'wscript.echo sRutaDatFile

End If '1er IF

'2- YA CON LAS VARIABLES PROCEDO A VALIDAR LA FECHA DE ACTUALIZACION DEL
ARCHIVO .DAT
'Fecha de hoy
DateToCheck = Date
'wscript.echo "Hoy es: " & DateToCheck

'SACO LA PROPIEDAD DE FECHA DEL ARCHIVO .DAT
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(sRutaDatFile)
sDateLastModified = objFile.DateLastModified

'Wscript.Echo "Fecha de actualización el DAT: " & sDateLastModified

'HAGO LA COMPARACION DE FECHAS
sDateCompara = sDateLastModified + 5
'wscript.echo sDateCompara
sNoActualizado = "DAT_NO_Actualizado"
sSiActualizado = "DAT_SI_Actualizado"

IF sDateCompara < DateToCheck Then '2do IF
sStatusDAT = sNoActualizado
' wscript.echo sStatusDAT
ELSE '2do IF
sStatusDAT = sSIActualizado
' wscript.echo sStatusDAT
END IF '2do IF

'3- AHORA LO GUARDA EN UN ARCHIVO DE TEXTO
sLog = sComputername &","& sUsername &","& sLogonServer &","& DateToCheck
&","& sDateLastModified &","& DatFile &","& sStatusDAT
'wscript.echo sLog

set objFile = nothing
Set objTextFile = objFSO.OpenTextFile _
("\\192.168.25.56\statusdat$\statusdat.txt", ForAppending, True)
objTextFile.WriteLine(sLog)
objTextFile.Close
wscript.quit 0
 

Leer las respuestas

#1 Fernando Reyes [MS MVP]
02/06/2009 - 16:27 | Informe spam
Aparentemente no hay nada malo en la forma en que escribe el fichero. Yo
probaría a establecer control de errores, por si se produce alguno al
escribir la información. De esta manera, al menos no se evitaría que se
cerrase el fichero.


Set objTextFile = objFSO.OpenTextFile _
("\\192.168.25.56\statusdat$\statusdat.txt", ForAppending, True)

On Error Resume Next
objTextFile.WriteLine(sLog)
On Error Goto 0

objTextFile.Close
wscript.quit 0


Otro enfoque sería ver si se ha producido el error, lanzando el script de
forma indirecta, con un bat que redireccionase la salida a un fichero de
control de error:

cscript //nologo script.vbs >>control.log

Un saludo
Fernando Reyes [MS MVP]
MCSE Windows 2000 / 2003
MCSA Windows Server 2003
http://freyes.svetlian.com
http://urpiano.wordpress.com
RSS: http://urpiano.wordpress.com/feed
freyes.champú@champú.mvps.org
(Aclárate la cabeza si quieres escribirme)



"Eduardo Ceh" wrote in message
news:
Buenas noches.
No se si este es el foro para esta pregunta pero ahi les va, cree un
script .vbs de inicio de sesión que recoge información de la maquina, el
usuario y la version del DAT del antivirus y esta información la guarda en
un .TXT en una carpeta compartida en un servidor para su posterior
analisis.

El detalle es que me he topado con 2-3 equipos/usuario que al ejecutar el
script dejan el archivo de texto abierto y por consiguiente nadie que se
valide posteriormente puede escribir su información hasta que voy al
servidor y cierro el archivo abierto.Antes de que se validen funciona al
100 % y despues de desbloquear el archivo igual funciona al 100%

Alguin sabrá porque puede producirse este comportamiento?? lo estoy
probando un una OU con 40 usuarios, pero la idea es ejecutarlo en todo el
dominio con unos 5,000 usuarios.

Les copio el script.

'1- PRIMERO DETECTO SI ES WINDOWS DE 32 O DE 64 BITS

On Error Resume Next

Const ForAppending = 8
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")
sComputerName = objWshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
sUsername = objWshShell.ExpandEnvironmentStrings("%USERNAME%")
sLogonServer = objWshShell.ExpandEnvironmentStrings("%LOGONSERVER%")


RutaEngine = "McAfee\Engine"
DatFile = "avvscan.dat"


' Ruta del registro donde se ve si es de 32 o de 64 Bits
X = objWshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session
Manager\Environment\PROCESSOR_ARCHITECTURE")

'PREPARO TODAS LAS VARIABLES PARA UTILIZARLAS EN LA VALIDACION POSTERIOR
(2)
If X = "x86" Then '1er IF
'SI es de 32 bits
'Declaro las variables de entorno de 32 Bits
'wscript.echo "Es un sistema operativo de 32 Bits"
sProgramFile = objWshShell.ExpandEnvironmentStrings("%PROGRAMFILES%") &
"\"
sComProgramFile =
objWshShell.ExpandEnvironmentStrings("%COMMONPROGRAMFILES%") & "\"
'wscript.echo sProgramfile
'wscript.echo sComProgramFile

sRutaEngine = sComProgramFile & RutaEngine
'wscript.echo sRutaEngine

sRutaDatFile = sRutaEngine & "\" &DatFile
'wscript.echo sRutaDatFile

Else '1er IF
'SI es de 64 bits
'Declaro las variables de entorno de 64 Bits
'wscript.echo "Es un sistema operativo de 64 Bits"
sProgramFile = objWshShell.ExpandEnvironmentStrings("%PROGRAMFILES(X86)%")
& "\"
sComProgramFile =
objWshShell.ExpandEnvironmentStrings("%COMMONPROGRAMFILES(X86)%") & "\"
'wscript.echo sProgramfile
'wscript.echo sComProgramFile

sRutaEngine = sComProgramFile & RutaEngine
'wscript.echo sRutaEngine

sRutaDatFile = sRutaEngine & DatFile
'wscript.echo sRutaDatFile

End If '1er IF

'2- YA CON LAS VARIABLES PROCEDO A VALIDAR LA FECHA DE ACTUALIZACION DEL
ARCHIVO .DAT
'Fecha de hoy
DateToCheck = Date
'wscript.echo "Hoy es: " & DateToCheck

'SACO LA PROPIEDAD DE FECHA DEL ARCHIVO .DAT
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(sRutaDatFile)
sDateLastModified = objFile.DateLastModified

'Wscript.Echo "Fecha de actualización el DAT: " & sDateLastModified

'HAGO LA COMPARACION DE FECHAS
sDateCompara = sDateLastModified + 5
'wscript.echo sDateCompara
sNoActualizado = "DAT_NO_Actualizado"
sSiActualizado = "DAT_SI_Actualizado"

IF sDateCompara < DateToCheck Then '2do IF
sStatusDAT = sNoActualizado
' wscript.echo sStatusDAT
ELSE '2do IF
sStatusDAT = sSIActualizado
' wscript.echo sStatusDAT
END IF '2do IF

'3- AHORA LO GUARDA EN UN ARCHIVO DE TEXTO
sLog = sComputername &","& sUsername &","& sLogonServer &","& DateToCheck
&","& sDateLastModified &","& DatFile &","& sStatusDAT
'wscript.echo sLog

set objFile = nothing
Set objTextFile = objFSO.OpenTextFile _
("\\192.168.25.56\statusdat$\statusdat.txt", ForAppending, True)
objTextFile.WriteLine(sLog)
objTextFile.Close
wscript.quit 0

Preguntas similares