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:
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 |
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 |
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!
.
OdpowiedzUsuńWszystko brzmi bardzo skomplikowanie.... ja póki co zacznę przygodę od zakupu dysku i zastanawiam się czy jeśli teraz mam hhd to czy mogę kupić taki ssd https://www.oleole.pl/dyski-wewnetrzne-ssd,_WD.bhtml i wymienić? Będzie wszystko działać?
OdpowiedzUsuń