Etykiety

środa, 25 stycznia 2017

Windows PowerShell - Informacje o dyskach

W niniejszym artykule mam zamiar omówić sposoby uzyskiwania szczegółowych informacji o dyskach fizycznych podpiętych do komputera pracującego pod kontrolą systemu operacyjnego Windows, w tym także informacji o dyskach podpiętych do maszyn Windows znajdujących się w sieci. Omówione tutaj sposoby oparte będą na poleceniach Windows PowerShell 5.0.

Windows PowerShell 5.0 omówiłem już wstępnie w artykule Wstęp do Windows PowerShell 5.0. Obiekty PowerShell też zostały już wstępnie omówione w artykule Wstęp do obiektów w PowerShell 5.0. Teraz mam zamiar skupić się głównie na cmdlecie get-PhysicalDisk, który służy do uzyskiwania informacji o fizycznych dyskach twardych podpiętych do komputera.

Zacznijmy od prostego zastosowania omawianego tutaj cmdleta. W swojej najprostszej formie, bez parametrów, cmdlet get-PhysicalDisk zwraca podstawowe informacje o dyskach fizycznych, podpiętych do lokalnego komputera. Zobaczmy przykładowo jak to działa:

PS C:\WINDOWS\system32> Get-PhysicalDisk FriendlyName SerialNumber CanPool OperationalStatus HealthStatus Usage Size ------------ ------------ ------- ----------------- ------------ ----- ---- KINGSTON SH103S3120G 50026B7239006B0C False OK Healthy Auto-Select 111.79 GB Samsung SSD 840 EVO 500GB S1DHNSBF607817L False OK Healthy Auto-Select 465.76 GB

W powyższym przykładzie uzyskaliśmy podstawowe informacje o dyskach. Jak łatwo zauważyć, tych informacji nie jest wiele.

Cmdlet get-PhysicalDisk zwraca obiekty klasy Microsoft.Management.Infrastructure.CimInstance#ROOT/Microsoft/Windows/Storage/MSFT_PhysicalDisk.

Jeśli pragniemy się dowiedzieć jakie właściwości i metody uwzględniają obiekty tej klasy, wystarczy przekierować obiekty wyjściowe polecenia get-PhysicalDisk do cmdleta gm, czyli get-Member, przykładowo można to zrobić w taki sposób:

Informacje o dyskach - Właściwości obiektów zwracanych przez get-PhysicalDisk
Dodaj Informacje o dyskach - Właściwości obiektów zwracanych przez get-PhysicalDisk


Jak widać jednak, można uzyskać niesłychanie dużo informacji związanych z dyskami twardymi.

Jeśli zatem zależy nam na większych szczegółach dotyczących dysków fizycznych, możemy przekierować wynik cmdleta get-PhysicalDisk do polecenia Format-List, uwzględniając interesujące nas właściwości obiektów wynikowych. Przykładowo można uwzględnić kilka dodatkowych właściwości, z tych, które mamy do wyspozycji dla obiektów tej klasy:

PS C:\WINDOWS\system32> Get-PhysicalDisk | Format-List FriendlyName, SerialNumber, HealthStatus, BusType, Size, AllocatedSize, FirmWareVersion, OperationalStatus FriendlyName : KINGSTON SH103S3120G SerialNumber : 50026B7239006B0C HealthStatus : Healthy BusType : SATA Size : 120034123776 AllocatedSize : 120034123776 FirmWareVersion : 521ABBF0 OperationalStatus : OK FriendlyName : Samsung SSD 840 EVO 500GB SerialNumber : S1DHNSBF607817L HealthStatus : Healthy BusType : SATA Size : 500107862016 AllocatedSize : 500106813440 FirmWareVersion : EXT0BB6Q OperationalStatus : OK

Ciekawostką wartą omówienia, a zarazem faktem, który może zainteresować zawodowych administratorów IT, jest to, że przekierowując obiekty wynikowe polecenia get-physicalDisk do cmdleta get-StorageReliabilityCounter możemy uzyskać informacje o aktualnym kompleksowym czasie użytkowania dysków, podanym w godzinach pracy. Daje to spore możliwości programistyczne, jeśli chodzi o pisanie skryptów powiadamiających o konieczności wymiany dysków na poszczególnych maszynach, co może być przydatne szczególnie w dużych sieciach:

PS C:\> get-PhysicalDisk | Get-StorageReliabilityCounter DeviceId Temperature ReadErrorsUncorrected Wear PowerOnHours -------- ----------- --------------------- ---- ------------ 1 0 6000 0 100 8302

Przejdźmy teraz do najciekawszej części tego artykułu, a mianowicie do pracy z poleceniem get-PhysicalDisk w środowisku sieciowym.

Wyjaśnię z góry, że wiele cmdletów PowerShell przyjmuje parametr -ComputerName, który umożliwia odnoszenie się do konkretnego komputera w sieci. Polecenie get-PhysicalDisk jednak nie przyjmuje takiego parametru. Jak zatem uzyskać informacje o dyskach podpiętych do dowolnego komputera w sieci? A co jeśli tych maszyn jest więcej i mamy zamiar zautomatyzować procedurę? Rozpoczynanie zdalnej sesji z wykorzystaniem enter-PSSession, dla każdej maszyny z osobna, byłoby w tym przypadku jednym z owszem działających, lecz raczej nieadekwatnych rozwiązań.

Windows PowerShell 5.0 dostarcza nam jednak bardzo pomocny w tym przypadku cmdlet, umożliwiający wykonywanie poiedyńczych poleceń na zdalnych komputerach. Jest to cmdlet o nazwie invoke-Command. Wyjaśnię, że ten cmdlet przyjmuje nie tylko parametr -Computername, pozwalający odnosić się do konkretnych maszyn w sieci, ale także, co ważne w przypadku rozległych sieci i konieczności zautomatyzowania całej tej procedury, parametr -Credential, który umożliwia zapodanie poświadczeń uprawnionego użytkownika, poświadczeń, które jak zobaczymy, można zachować w zmiennej, w celu ich póżniejszego wykorzystania.

Przypominam, że maszyny biorące udział w operacjach sieciowych powinny mieć uruchomioną usługę WinRM. Aby takową usługę uruchomić należy z wiersza poleceń PowerShell wykonać następujący cmdlet:

Enable-PsRemoting

Pamiętajmy również, że w przypadku wykonywania poleceń PowerShell w sieci opartej na tak zwanych grupach roboczych, a nie na domenach Microsoft, maszyny docelowe powinny znajdować się na liście trusted-host klienta z którego wydawane są polecenia PowerShell, a w przeciwnym przypadku polecenia nie zadziałają.

Aby dodać maszynę do listy trusted-hosts można, przykładowo, postąpić w taki oto sposób:

PS WSMan:\> set-item wsman:\localhost\Client\TrustedHosts -value 'NAZWA_KOMPUTERA' WinRM Security Configuration. This command modifies the TrustedHosts list for the WinRM client. The computers in the TrustedHosts list might not be authenticated. The client might send credential information to these computers. Are you sure that you want to modify this list? [Y] Yes [N] No [S] Suspend [?] Help (default is "Y"):

Załóżmy teraz, że chcemy się dowiedzieć więcej o dyskach podpiętych do kilku maszych Windows. Warto zautomatyzować taką procedurą. Zobaczmy jak to można przykładowo zrobić.

Pierwszym krokiem jest zapisanie poświadczeń uprawnionego użytkownika w zmiennej sesyjnej:

PS C:\WINDOWS\system32> $admin = get-Credential MOJADOMENA\Admin1

Wykonanie powyższego cmdleta powoduje wyświetlenie się okienka z monitem o hasło zapodanego użytkownika. Po wprowadzeniu prawidłowego hasła, obiekt poświadczeń zostaje zapisany w wybranej zmiennej sesyjnej, w tym przypadku jest to zmienna $admin.

Informacja o dyskach w sieci - Zapis poświadczeń w zmiennej
Informacja o dyskach w sieci - Zapis poświadczeń w zmiennej


Na tym etapie, możemy już wykonać, w sposób częściowo zautomatyzowany, polecenie get-PhysicalDisk na zdalnych maszynach, przykładowo w następujący sposób:

PS C:\> $args = "SPHINX", "THOR"; invoke-Command -ComputerName $args -Credential $admin -ScriptBlock { get-PhysicalDisk }

Jak łatwo zauważyć, parametr -ComputerName akceptuje jako argument tablicę zmiennych. Przykładowym wynikiem powyższego polecenia, w którym jasno widnieje nazwa komputera, może być:

Informacje o dyskach w sieci
Informacje o dyskach w sieci

Oczywiście, w przypadku dużych sieci i konieczności wykonywania częstej diagnostyki stanu dysków oraz ich dostępności, warto jest napisać odpowiednie funkcje PowerShell, które pozwolą zaoszczędzić na ilości wpisywanych znaków poleceń. Ten temat jednak wykracza poza zakres niniejszego artykułu.

Powodzenia! W przypadku jakichkolwiek uwag lub wątpliwości proszę o komentarze!

Brak komentarzy:

Prześlij komentarz

Dodaj komentarz