.png)
Tenemos un problema con la gente de nuestra empresa que deja su computadora funcionando las 24 horas del día, los 7 días de la semana, incluso los fines de semana. Nuestra política corporativa es cerrar cuando no esté en uso, pero eso no siempre sucede. Entonces, lo que hemos estado haciendo es ejecutar un script simple usando PsInfo para reducir el tiempo de actividad de las computadoras. Exportamos la lista de computadoras de AD a un archivo de texto, luego usamos un archivo por lotes para revisar la lista, extraemos la información de tiempo de actividad y la guardamos en otro archivo de texto:
For /F "tokens=*" %%i in (ComputerList.txt) do psinfo uptime -nobanner \\%%i 1>>UptimeResults.txt
Funciona muy bien, pero si una computadora no está en línea, el tiempo de espera predeterminado parece ser de 60 segundos, lo que puede hacer que el script tarde mucho tiempo en cientos de computadoras. PsExec en sí tiene un interruptor de tiempo de espera que puede usar, pero PsInfo no parece tenerlo en cuenta. ¿Hay otra forma de forzar el tiempo de espera después de, digamos, 10 segundos o un programa diferente que haga lo mismo? ¿Posiblemente usando PsExec directamente con el interruptor de tiempo de espera y algún otro comando? Como nota al margen, ya hemos desactivado el arranque rápido para que los resultados del tiempo de actividad sean precisos.
Cosas que hemos debatido pero esperamos una solución más fácil: usar PsExec y ejecutarlo, systeminfo | find "Boot Time"
luego analizar el tiempo de arranque y hacer algunos cálculos para obtener el tiempo de ejecución. Obtener una copia antigua de uptime.exe, implementarla en las computadoras y usar su salida con PsExec. Y cambiar a un comando de PowerShell que sondearía WMI para el último arranque una y otra vez haría los cálculos. Todos parecen demasiado complicados y preferirían una solución fácil pero lenta a menos que alguien tenga una sugerencia mejor.
Respuesta1
Me gustaLa sugerencia de Greg.para obtener la hora del último inicio.
Pero creo que lo siguiente hará lo que usted pidió. Utilizo WMIC para iniciar PSINFO dentro de una nueva sesión de cmd.exe. FOR /F se utiliza para capturar el PID de la nueva sesión CMD. Luego llamo a una rutina para monitorear el proceso por hasta 10 segundos. Si ya no funciona, regrese inmediatamente. Pero después de 10 segundos cierro el proceso antes de regresar.
Probé el proceso de inicio y monitoreo con un proceso de TIEMPO DE ESPERA ficticio. Pero no pude probar con PSINFO porque no tengo PSINFO, ni tengo su entorno.
@echo off
setlocal
set "timeout=10"
set "log=UptimeResults.txt"
:: Start with an empty result file
copy /y nul %log% >nul
:: Loop through the list of computers
for /f "tokens=*" %%i in (ComputerList.txt) do (
%= For each computer, launch PSINFO via wmic and use FOR /F to capture the parent cmd.exe session PID =%
%= The cd argument is the location where the process should run (current directory) =%
for /f "tokens=2 delims=;= " %%P in (
'wmic process call create 'cmd /c "psinfo uptime -nobanner \\%%i 1>>%log%"'^, "%cd%" ^| find "ProcessId"'
) do call :monitor %%P 2>nul 1>nul
)
exit /b
:monitor PID
:: Monitor up to %timeout% seconds and return immediately if process no longer running
for /l %%N in (1 1 %timeout%) do (
timeout 1
tasklist /fi "pid eq %1" | find "cmd.exe" || exit /b
)
:: It has been longer than %timeout% seconds, so kill the process
taskkill /pid %1 /f /t
exit /b