Windows

將 PsInfo 與超時過程一起使用(或通過 PsExec 進行管道傳輸?)

  • January 13, 2020

我們公司的員工即使在周末也讓他們的電腦 24/7 全天候執行,我們對此有疑問。我們的公司政策是在不使用時關閉,但這並不總是發生。所以我們一直在做的是使用 PsInfo 執行一個簡單的腳本來拉回電腦的正常執行時間。我們將電腦列表從 AD 導出到文本文件中,然後使用批處理文件瀏覽列表,提取正常執行時間資訊,並將其保存到另一個文本文件中:

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

效果很好,但是如果電腦不線上,預設超時似乎是 60 秒,這可能會導致腳本在數百台電腦上花費很長時間。PsExec 本身有一個可以使用的超時開關,但 PsInfo 似乎沒有考慮到這一點。是否有另一種方法可以在 10 秒後強制它超時,或者使用不同的程序來做同樣的事情?可能直接將 PsExec 與超時開關和其他命令一起使用?附帶說明一下,我們已經禁用了快速啟動,因此正常執行時間結果是準確的。

我們已經討論過但希望有一個更簡單的解決方案:使用 PsExec 並執行,systeminfo | find "Boot Time"然後分析啟動時間並進行一些數學運算以獲得執行時間。獲取 uptime.exe 的舊副本,將其部署到電腦,並將其輸出與 PsExec 一起使用。並切換到一個 powershell 命令,該命令將輪詢 WMI 上次啟動時間並再次進行數學運算。一切似乎都過於復雜,除非其他人有更好的建議,否則寧願使用簡單但緩慢的解決方案。

我喜歡Greg 關於獲得最後一次啟動時間的建議。

但我相信以下內容會滿足您的要求。我使用 WMIC 在新的 cmd.exe 會話中啟動 PSINFO。FOR /F 用於擷取新 CMD 會話的 PID。然後我呼叫一個常式來監控這個過程長達 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

引用自:https://serverfault.com/questions/998740