Назад | Перейти на главную страницу

Использование PsInfo с процедурой тайм-аута (или подключение через PsExec?)

У нас есть проблема с людьми в нашей компании, которые оставляют свои компьютеры работающими 24/7 даже в выходные дни. Наша корпоративная политика - отключаться, когда они не используются, но это происходит не всегда. Итак, что мы делаем, это запускаем простой скрипт с использованием PsInfo, чтобы сократить время безотказной работы компьютеров. Мы экспортируем список компьютеров из AD в текстовый файл, затем используем командный файл, чтобы просмотреть список, получить информацию о времени безотказной работы и сохранить ее в другой текстовый файл:

For /F "tokens=*" %%i in (ComputerList.txt) do psinfo uptime -nobanner \\%%i  1>>UptimeResults.txt

Отлично работает, но если компьютер не подключен к сети, таймаут по умолчанию составляет 60 секунд, что может привести к тому, что сценарий может занять очень много времени для сотен компьютеров. Сам PsExec имеет переключатель тайм-аута, который вы можете использовать, но PsInfo, похоже, не принимает это во внимание. Есть ли другой способ заставить его тайм-аут, скажем, через 10 секунд, или другую программу, которая будет делать то же самое? Возможно, использование PsExec напрямую с переключателем тайм-аута и какой-либо другой командой? Кстати, мы уже отключили fastboot, поэтому результаты безотказной работы точны.

То, что мы обсуждали, но надеемся на более простое решение: использование PsExec и запуск systeminfo | find "Boot Time" затем проанализируйте время загрузки и выполните математические вычисления, чтобы получить время выполнения. Получение старой копии uptime.exe, ее развертывание на компьютерах и использование ее вывода с PsExec. И переключимся на команду PowerShell, которая будет опрашивать WMI на предмет последней загрузки, снова и снова, делать математику. Все кажется чрезмерно сложным и предпочел бы простое, но медленное решение, если только у кого-то нет лучшего предложения.

мне нравиться Предложение Грега чтобы узнать время последней загрузки.

Но я верю, что следующее сделает то, о чем вы просили. Я использую WMIC для запуска PSINFO в новом сеансе cmd.exe. FOR / F используется для захвата PID нового сеанса CMD. Затем я вызываю программу для наблюдения за процессом в течение 10 секунд. Если он больше не работает, немедленно возвращайтесь. Но через 10 секунд я убиваю процесс, прежде чем вернуться.

Я протестировал процесс запуска и мониторинга с помощью фиктивного процесса TIMEOUT. Но я не смог протестировать с помощью PSINFO, потому что у меня нет ни PSINFO, ни вашей среды.

@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