Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików Cookies.



26.10.2020

Nowa wersja nVision

Można już pobierać nową wersję nVision
26.10.2020

Monitorowanie infrastruktury

Vertiv Environet Alert
23.10.2020

Telefonia w chmurze

NFON Cloudya
23.10.2020

Nowości w EDR

Bitdefender GravityZone
23.10.2020

Wykrywanie anomalii

Flowmon ADS11
23.10.2020

Mobilny monitor

AOC 16T2
22.10.2020

HP Pavilion

HP zaprezentowało nowe laptopy z linii Pavilion.
22.10.2020

Inteligentny monitoring

WD Purple SC QD101
22.10.2020

Przełącznik 2,5GbE

QNAP QSW-1105-5T

REST API w PowerShell na przykładzie CommVault

Data publikacji: 24-09-2020 Autor: Bartosz Bielawski

Coraz więcej technologii oferuje dostęp do konfiguracji za pomocą REST API. Skorzystać z tych możliwości można dzięki poleceniom PowerShell, co jednak może się wiązać z określonymi wyzwaniami – choćby w zakresie zarządzania danymi uwierzytelniającymi. Warto zatem poznać mechanizmy, które uczynią korzystanie z REST API wygodniejszym.

 

Użytkownicy PowerShella dysponują dwoma poleceniami, dzięki którym możemy się bez trudu łączyć z tego rodzaju interfejsami – Invoke-WebRequest oraz Invoke-RestMethod. Warto rozważyć nieco inne rozwiązanie: zamiast zapamiętywać kroki konieczne przy uwierzytelnianiu, ścieżki do poszczególnych obiektów i wymagane elementy nagłówka, warto „opakować” całość w przyjazne uczestnikowi polecenia, dzięki którym zyskamy rozwiązanie pasujące do standardów oczekiwanych przez użytkowników PowerShella.


W ten sposób możemy utworzyć moduł, który pozwoli nam zapomnieć, z jakiego interfejsu korzystamy w czasie zarządzania danym produktem, i skupić się na elementach konfiguracji. Przyjrzymy się więc podstawowemu zastosowaniu – mianowicie jak przygotować moduł pozwalający zarządzać narzędziem do tworzenia kopii bezpieczeństwa: CommVault CommServe.

 

Zacznijmy od lektury dokumentacji do wspomnianego interfejsu REST, zaczynając od elementu absolutnie niezbędnego przy jakichkolwiek operacjach: uwierzytelniania. Bez poprawnego uwierzytelnienia nie będziemy mieli szansy skorzystać z dostępnego dla wykorzystywanego konta poziomu autoryzacji. Możliwości są trzy.


Część interfejsów wspierać będzie przekazywanie uwierzytelniania bezpośrednio do poszczególnych poleceń z wykorzystaniem parametru Credential. Jeśli będziemy mieli szczęście, interfejs wspierać będzie również uwierzytelnienia domyślne, dzięki czemu korzystać będziemy z konta, w ramach którego uruchomiona jest bieżąca sesja PowerShella:


Invoke-RestMethod -Credential $mojeUwierzytelnienie -Uri $uriZasób
Invoke-WebRequest -UseDefaultCredentials -Uri $uriZasób


Druga możliwość to praca w ramach sesji. Uwierzytelnienie przekażemy na początku, tworząc sesję, a następnie wszystkie operacje wykonywać będziemy z wykorzystaniem tak utworzonej sesji:


$request = Invoke-WebRequest -Uri $uriLogowanie -SessionVariable sesja
$formularz = $request.Forms[0]
$formularz.Fields["username"] = $użytkownik
$formularz.Fields["password"] = $hasło
$request = Invoke-WebRequest -Uri $uriLogowanie -WebSession $sesja `
-Method POST -Body $formularz.Fields
Invoke-RestMethod -uri $uriZasób -WebSession $sesja


Opcja trzecia wymaga początkowego uwierzytelniania za pomocą specjalnie do tego przygotowanego interfejsu. W odpowiedzi uzyskujemy żeton, który następnie przekazujemy do pozostałych interfejsów za pomocą jednego z nagłówków. Musimy więc przechwycić obiekt zwrócony przez pierwszy interfejs i następnie sformułować odpowiedni nagłówek w trakcie korzystania z pozostałych interfejsów:


$odpowiedź = Invoke-RestMethod -Method Post -Uri $uriLogowanie -Body $daneLogowania
$nagłówek = @{
Authtoken = $odpowiedź.token }
Invoke-RestMethod -Uri $uriZasób -Headers $nagłówek


To z trzeciej opcji powinniśmy skorzystać w trakcie pracy z CommVault REST API.

 

Łącząc się z REST API CommVault, musimy przekazać do serwera nasze uwierzytelnienia w taki sam sposób, w jaki czynimy to z użyciem z konsoli. Zasadnicza różnica to brak wsparcia dla Windows Integrated Authentication – nawet jeśli bieżące konto posiada uprawnienia w CommVault, musimy przy uwierzytelnianiu podać nazwę użytkownika i hasło.

 

Poniżej przedstawiamy przykładowy kod pozwalający połączyć się z końcówką odpowiedzialną za logowanie. W zmiennej $script:commVaultConnection przechowamy wartość zwróconą nam przez API:

 

$script:commVaultConnection = Invoke-RestMethod @parametry -Body (
@{
domain = $Credential.GetNetworkCredential().Domain
username = $Credential.GetNetworkCredential().UserName
password = [Convert]::ToBase64String(
[Text.Encoding]::UTF8.GetBytes(
$Credential.GetNetworkCredential().Password
)
)
} | ConvertTo-Json
)


Odpowiedź ta zawierać będzie wspomniany wcześniej żeton, który następnie przekazywać będziemy do pozostałych końcówek REST w celu odczytania bądź modyfikacji konfiguracji. Przykładowo jeśli zechcemy uzyskać informację o serwerze „test”, to skorzystamy z następującego kodu:


$restSplat = @{
Headers = @{
Accept = 'application/json'
Authtoken = $script:commVaultConnection.token
}
ContentType = 'application/json'
ErrorAction = 'Stop'
Uri = "$commVaultUri/SearchSvc/CVWebService.svc/Client/byName(clientName='test')"
}
Invoke-RestMethod @restSplat


Tworząc moduł, możemy wykorzystać tę zależność. Zamiast każdorazowo przekazywać nasze poświadczenia, stworzymy polecenie, które połączy się ze wspomnianą powyżej końcówką, a wynik tego działania przechowa w zmiennej w naszym module. Każde kolejne polecenie, które utworzymy, będzie korzystać z utworzonego w ten sposób połączenia. Oprócz komendy, która ustanowi połączenie, dodamy też funkcję, która pozwoli nam uzyskać informację o aktualnym połączeniu:


function New-CommVaultConnection {
param (
[Parameter(Mandatory)]
[String]
$Uri,
[Parameter(Mandatory)]
[pscredential]
[Management.Automation.Credential()]
$Credential
)
$parametry = @{
Uri = "$Uri/SearchSvc/CVWebService.svc/Login"
Method = 'Post'
Headers = @{
Accept = 'application/json'
}
ContentType = 'application/json'
ErrorAction = 'Stop'
}
$script:commVaultConnection = Invoke-RestMethod @parametry -Body (
@{
domain = $Credential.GetNetworkCredential().Domain
username = $Credential.GetNetworkCredential().UserName
password = [Convert]::ToBase64String(
[Text.Encoding]::UTF8.GetBytes(
$Credential.GetNetworkCredential().Password
)
)
} | ConvertTo-Json
)
$script:commVaultConnection | Add-Member -NotePropertyMembers @{
Uri = $Uri
LastUsed = Get-Date
UserName = $Credential.UserName
}
$script:commVaultConnection
}
function Get-CommVaultConnection {
[CmdletBinding()]
param ()
$script:commVaultConnection
}

 

[...]

 

Autor zawodowo zajmuje się informatyką. Jest Microsoft MVP w dziedzinie PowerShella, blogerem oraz jednym z moderatorów forum dotyczącego skryptów w serwisie TechNet. Autor książki „Windows PowerShell 5.1 Biblia”.

Pełna treść artykułu jest dostępna w papierowym wydaniu pisma.

.

Transmisje online zapewnia: StreamOnline

All rights reserved © 2019 Presscom / Miesięcznik "IT Professional"