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

У нас проблема с людьми в нашей компании, которые оставляют свои компьютеры работающими круглосуточно, без выходных, даже по выходным. Наша корпоративная политика - отключаться, когда они не используются, но это происходит не всегда. Итак, что мы делаем, это запускаем простой скрипт с использованием 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 | найдите «Время загрузки» , затем проанализируйте время загрузки и произведите математические вычисления, чтобы получить время выполнения. Получение старой копии uptime.exe, ее развертывание на компьютерах и использование ее вывода с PsExec. И переключимся на команду PowerShell, которая будет опрашивать WMI на предмет последней загрузки, снова и снова, делать математику. Все они кажутся слишком сложными и предпочли бы простое, но медленное решение, если только у кого-то нет лучшего предложения.

0
задан 13 January 2020 в 18:50
1 ответ

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

Но я верю, что следующее сделает то, что вы просили. Я использую 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
1
ответ дан 14 January 2020 в 23:28

Теги

Похожие вопросы