Pobieranie informacji o modułach jakie wykorzystuje proces
Ktos
Każdy proces może wykorzystywać wiele różnych modułów i bibliotek DLL, a dostęp do informacji które z nich wykorzystuje może mieć wymierne korzyści, na przykład w celach diagnostycznych.
Aby uzyskać dostęp do listy modułów jakie wykorzystuje dany aktywny proces w systemie można posłużyć się komendą Get-Process, która zwraca komplet informacji o danym procesie (lub o procesach aktywnych w systemie).
Przykładowo komenda:
Get-Process explorer | Format-List *
zwróci nam komplet dostępnych informacji o procesie Eksploratora, w tym element o nazwie Modules, będący kolejną kolekcją, którą możemy wykorzystać.
MainModule : System.Diagnostics.ProcessModule (Explorer.EXE)
MaxWorkingSet : 1413120
MinWorkingSet : 204800
Modules : {Explorer.EXE, ntdll.dll, kernel32.dll, ADVAPI32.dll...}
NonpagedSystemMemorySize : 22264
NonpagedSystemMemorySize64 : 22264
PagedMemorySize64 : 29528064
PagedSystemMemorySize : 316696
PagedSystemMemorySize64 : 316696
PeakPagedMemorySize : 232783872
PeakPagedMemorySize64 : 232783872
PeakWorkingSet : 42446848
(...)
Wylistowanie wszystkich modułów możemy zrealizować na przykład przez proste polecenie:
(Get-Process explorer).Modules | Format-Table
PS E:\> (Get-Process explorer).Modules | Format-Table
Size(K) ModuleName FileName
------- ---------- --------
2868 Explorer.EXE C:\Windows\Explorer.EXE
1144 ntdll.dll C:\Windows\system32\ntdll.dll
864 kernel32.dll C:\Windows\system32\kernel32.dll
764 ADVAPI32.dll C:\Windows\system32\ADVAPI32.dll
780 RPCRT4.dll C:\Windows\system32\RPCRT4.dll
300 GDI32.dll C:\Windows\system32\GDI32.dll
632 USER32.dll C:\Windows\system32\USER32.dll
680 msvcrt.dll C:\Windows\system32\msvcrt.dll
340 SHLWAPI.dll C:\Windows\system32\SHLWAPI.dll
11064 SHELL32.dll C:\Windows\system32\SHELL32.dll
1296 ole32.dll C:\Windows\system32\ole32.dll
560 OLEAUT32.dll C:\Windows\system32\OLEAUT32.dll
1052 SHDOCVW.dll C:\Windows\system32\SHDOCVW.dll
252 UxTheme.dll C:\Windows\system32\UxTheme.dll
104 POWRPROF.dll C:\Windows\system32\POWRPROF.dll
48 dwmapi.dll C:\Windows\system32\dwmapi.dll
1704 gdiplus.dll C:\Windows\WinSxS\x86_microsoft.windows.gdiplus_6595b6...
228 slc.dll C:\Windows\system32\slc.dll
(...)
A szczegółowe informacje o danym module można łatwo uzyskać, odwołując się do odpowiedniego elementu danej kolekcji:
(Get-Process explorer).Modules[5] | Format-List *
PS E:\> (Get-Process explorer).Modules[5] | Format-List *
Size : 300
Company : Microsoft Corporation
FileVersion : 6.0.6000.16386 (vista_rtm.061101-2205)
ProductVersion : 6.0.6000.16386
Description : GDI Client DLL
Product : MicrosoftR WindowsR Operating System
ModuleName : GDI32.dll
FileName : C:\Windows\system32\GDI32.dll
BaseAddress : 1984167936
ModuleMemorySize : 307200
EntryPointAddress : 1984205625
FileVersionInfo : File: C:\Windows\system32\GDI32.dll
InternalName: gdi32
OriginalFilename: gdi32
FileVersion: 6.0.6000.16386 (vista_rtm.061101-2205)
FileDescription: GDI Client DLL
Product: MicrosoftR WindowsR Operating System
ProductVersion: 6.0.6000.16386
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language: English (United States)
Site :
Container :
Używając komendy Foreach-Item (czyli de facto pętli foreach) można na przykład policzyć ile pamięci zajmują wszystkie moduły wykorzystywane przez dany proces:
$size = 0; (Get-Process explorer).Modules | foreach { $size += $_.Size }; $size
PS E:\> $size = 0; (Get-Process explorer).Modules | foreach { $size += $_.Size }; $size
82496
Wynik został podany w kilobajtach. Z kolei odwołując się do parametru Count kolekcji można dowiedzieć się z ilu modułów korzysta dany proces:
(Get-Process powershell).Modules.Count
PS E:\> (Get-Process powershell).Modules.Count
67
PS E:\>