Войти

Показать полную графическую версию : [решено] Получение списка всех процессов


NLOLegion
03-01-2020, 05:56
Подскажите как получить список ВСЕХ процессов с "временем запуска"?
Получить дату и время запуска всех процессов в текстовый файл.
По возможности не на PowerShell. cmd,bat.

DJ Mogarych
03-01-2020, 09:49
CMD:

powershell -command "Get-Process |select name,starttime |Out-File c:\temp\processlist.txt"

Iska
03-01-2020, 10:21
>"c:\temp\processlist.txt" wmic.exe Process get Name, CreationDate

DJ Mogarych
03-01-2020, 10:27
Iska, а формат даты можно как-нибудь подкрутить?

Busla
03-01-2020, 10:55
DJ Mogarych, я догадываюсь, что топикстартеру, всё едино: что водка, что пулемёт - лишь бы с ног валило
и самому мне нравится PowerShell, но давайте всё же придерживаться заданной тематики
PoSh - не панацея:
1. Он не всегда есть - в том же PE, контейнерах
2. Он тяжело запускается - "примитивный" healthcheck, реализованный подобным образом, выжирает нереально много ресурсов

Iska
03-01-2020, 11:03
DJ Mogarych, напрямую — боюсь, что нет. Возможно, этого можно добиться, поковырявшись во внутренностях C:\Windows\System32\wbem, но я не жажду ;). Wbem-то рассчитано в первую очередь на работу с приложениями посредством Automation, а wmic.exe — это такой паллиатив, появившийся в Windows XP — для тех, кто не сумел в тот же WSH.

Кроме того, можно разобрать вывод wmic.exe посредством for /f, и там слепить, что потребно. Наподобие:
@echo off
setlocal enableextensions enabledelayedexpansion

>"c:\temp\processlist.txt" (
echo Creation Date/Time Name

for /f "usebackq skip=2 tokens=1,2" %%i in (`wmic.exe Process get Name^, CreationDate ^| findstr.exe /i /r /c:"^[0-9]"`) do (
set sDateTime=%%i
echo !sDateTime:~6,2!.!sDateTime:~4,2!.!sDateTime:~0,4! !sDateTime:~8,2!:!sDateTime:~10,2!:!sDateTime:~12,2! %%~j
)
)

endlocal
exit /b 0

megaloman
03-01-2020, 15:15
With CreateObject("Scripting.FileSystemObject").CreateTextFile("Z:\Box_Out\process.txt", True)
Out = "Creation Date Caption and ExecutablePath"
For Each iProc In GetObject("winmgmts:").ExecQuery("Select * From Win32_Process")
With iProc
DT = CStr(.CreationDate)
Out = Out + vbCrLf + Mid(DT, 1, 4) + "." + Mid(DT, 5, 2) + "." + Mid(DT, 7, 2) + " " + Mid(DT, 9, 2) + ":" + Mid(DT, 11, 2) + ":" + Mid(DT, 13, 2) + " " + .Caption
If Not IsNull(.ExecutablePath) Then Out = Out + " " + .ExecutablePath
End With
Next
.Write Out
.Close
End With

NLOLegion
03-01-2020, 15:28
Круто! Спасибо большое! всё работает!

Конечный результат выглядит так: (???)

powershell -command "Get-Process |select name,starttime |Out-File c:\temp\processlist.txt"

@echo off
setlocal enableextensions enabledelayedexpansion

>"c:\temp\processlist.txt" (
echo Creation Date/Time Name

for /f "usebackq skip=2 tokens=1,2" %%i in (`wmic.exe Process get Name^, CreationDate ^| findstr.exe /i /r /c:"^[0-9]"`) do (
set sDateTime=%%i
echo !sDateTime:~6,2!.!sDateTime:~4,2!.!sDateTime:~0,4! !sDateTime:~8,2!:!sDateTime:~10,2!:!sDateTime:~12,2! %%~j
)
)

endlocal
exit /b 0


Или как-то изящней надо сделать?(допускаю что фигню пишу)

Iska
03-01-2020, 15:58
допускаю что фигню пишу »
Ага. Файл c:\temp\processlist.txt у Вас создаётся дважды: сначала посредством PowerShell, а затем переписывается поверх непосредственно из кода пакетного файла.

Mid(DT, 1, 4) + "." + Mid(DT, 5, 2) + "." + Mid(DT, 7, 2) + " " + Mid(DT, 9, 2) + ":" + Mid(DT, 11, 2) + ":" + Mid(DT, 13, 2) »
Правильнее будет так:
Option Explicit

Dim objSWbemServicesEx
Dim objSWbemDateTime
Dim objSWbemObjectEx


Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
Set objSWbemDateTime = WScript.CreateObject("WbemScripting.SWbemDateTime")

WScript.Echo "Creation Date/Time" & vbTab & "Name"

For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT Name, CreationDate FROM Win32_Process")
objSWbemDateTime.Value = objSWbemObjectEx.CreationDate
WScript.Echo objSWbemDateTime.GetVarDate() & vbTab & objSWbemObjectEx.Name
Next

Set objSWbemDateTime = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0

DJ Mogarych
03-01-2020, 16:15
Ещё вариант:


powershell -command "gcim win32_process |select name,creationdate |Out-File c:\temp\processlist.txt"


gcim сразу даёт нормальный формат времени, в отличие от gwmi, который даёт DTMF datetime. Однако, это можно сконвертировать:


powershell -command "gwmi win32_process |select name,@{n='starttime';e={$_.converttodatetime($_.creationdate)}} |Out-File c:\temp\processlist.txt"


я догадываюсь, что топикстартеру, всё едино: что водка, что пулемёт - лишь бы с ног валило »Из этого я и исходил. Полагаю, что если бы задача требовала каких-то спецусловий, это было бы упомянуто.




© OSzone.net 2001-2012