PowerShell » Gotowce

Pobieranie informacji o modułach jakie wykorzystuje proces

  • 2007-09-07 19:07
  • 0 komentarzy
  • 1531 odsłon
  • Oceń ten tekst jako pierwszy
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:\>