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



05.09.2022

Łatwiejsza migracja do chmur

Commvault i Oracle rozszerzyły partnerską współpracę i wspólnie oferują rozwiązanie...
01.09.2022

Badanie sieci

QNAP ogłosił wprowadzenie oprogramowania ADRA Network Detection and Response (NDR) dla...
01.09.2022

5G w Polsce

Z badania Kearney 5G Readiness Index 2022 wynika, że Polska jest jednym z najgorzej...
01.09.2022

Zarządzanie działaniami

Fortinet zaprezentował chmurową usługę, która koreluje informacje dotyczące...
01.09.2022

Selektywna rejestracja

Naukowcy z UCLA przedstawili projekt inteligentnej kamery, która pozwala wybrać, jaki...
01.09.2022

Więcej mocy, komputer...

Profesjonalny komputer Dell Precision 7865 Tower z AMD Ryzen Threadripper PRO 5000...
01.09.2022

Rekord prędkości

Firma Aorus zapowiada superszybki dysk, następcę modelu Gen4 7000s SSD, który ma oferować...
01.09.2022

Beprzewodowe drukowanie

Firma Brother wprowadziła do swojego portfolio nowe urządzenie wielofunkcyjne z systemem...
01.09.2022

Obraz dobrze zaprogramowany

Monitor interaktywny Lyra to połączenie Androida 11, szyby antybakteryjnej, wbudowanego...

Zarządzanie grupami na serwerze WSUS

Data publikacji: 01-09-2022 Autor: Bartosz Bielawski

W poprzednim artykule skupiliśmy się na konfigurowaniu serwera WSUS za pomocą Windows PowerShell Desired State Configuration. Aby w pełni skonfigurować nasz serwer, brakowało nam środków do zarządzania grupami – ich strukturą oraz członkostwem w grupach. W tej części postaramy się przygotować odpowiednie narzędzie przeznaczone do tego celu oraz konfigurację, która to narzędzie wykorzysta.

 

Tworząc zasoby DSC, mamy dwie możliwości: tradycyjne zasoby skryptowe oraz zasoby definiowane za pomocą klas PowerShella. Na potrzeby tego artykułu stworzymy ten drugi rodzaj. Tworzenie zasobów tego typu jest prostsze, a dodatkowo Microsoft w przyszłości zamierza skupić się na rozwiązaniach, które wspierać będą jedynie zasoby zbudowane z wykorzystaniem klas.


Klasy w PowerShellu


Klasy w PowerShellu mają dość ograniczone zastosowanie, a ich pojawienie się jest ściśle związane z DSC właśnie. Wyróżniamy dwa podstawowe typy klas: typy obliczeniowe (definiowane za pomocą słowa kluczowego enum) oraz klasy regularne (słowo kluczowe class). Po słowie kluczowym i nazwie klasy umieścimy blok skryptu definiujący dany typ. Dla typu obliczeniowego będzie to lista właściwości:

 

enum kolor {
czerwony
żółty
zielony
}


Dla klasy definiować będziemy trzy rodzaje elementów: właściwości, metody oraz konstruktory (stanowiące specjalny typ metody, której produktem jest instancja naszej klasy). Właściwości to po prostu zmienne, dla których możemy określić zarówno typ, jak i wartość domyślną. Metody definiujemy przez podanie zwracanego typu, nazwy oraz listy parametrów. W przeciwieństwie do innych konstrukcji w PowerShellu nasza metoda dla każdej ścieżki musi zwrócić albo wyjątek, albo obiekt wybranego typu za pomocą słowa kluczowego return. Konstruktory tworzymy, podając nazwę naszej klasy, listę parametrów i blok skryptu, który przeprowadzać będzie na tworzonej instancji (dostęp za pomocą wbudowanej zmiennej $this, która dostępna jest też w innych metodach). Zasoby to klasy PowerShella ze specjalnym atrybutem [DscResource].

 

Właściwości struktury zasobów DSC


Każdy zasób w PowerShellu musi oferować trzy akcje: pobranie informacji o stanie systemu (metoda Get w ramach tworzonej przez nas klasy), sprawdzenie zgodności stanu bieżącego z wymaganym (metoda Test) oraz doprowadzenie opisywanego zasobu do wymaganego stanu (metoda Set). Oprócz metod musimy też zadbać o właściwości opisujące nasz zasób. Ważne, by dla każdego zasobu określić zestaw właściwości, które dokładnie określają nasz zasób – dzięki nim mamy pewność, że zmian dokonywać będziemy tam, gdzie zamierzaliśmy. Oprócz tego konieczne są też właściwości, które będziemy chcieli odpowiednio skonfigurować, począwszy od tego, czy obiekt ma istnieć (Ensure). W przypadku grup w ramach WSUS kluczową właściwością może być nazwa grupy. Wymagana będzie też pozycja w hierarchii (a dokładnie: nazwa grupy nadrzędnej) oraz wspomniana już właściwość pozwalająca określić, czy grupa ma istnieć.


[DscProperty(Key)]
[String]$Name
[DscProperty()]
[AllowEmptyString()]
[String]$Parent = 'Okresowe'
[DscProperty()]
[Ensure]$Ensure = [Ensure]::Present


W przypadku członkostwa w grupie podawać będziemy jedynie nazwę grupy oraz listę komputerów, które się mają w niej znaleźć:


[DscProperty(Key)]
[String]$Name
[DscProperty(Mandatory)]
[string[]]$Computers
[DscProperty()]
[Ensure]$Ensure = [Ensure]::Present


Poza właściwościami opisującymi nasz zasób przydadzą nam się też inne, które pozwolą nam przechowywać informację wspólną dla wszystkich metod. Dla przykładu możemy zechcieć dodać właściwość opisującą nasz serwer WSUS oraz metodę pomocniczą, dzięki której przypiszemy do niej ten serwer. Inna wspólna dla obu zasobów metoda pomocnicza to ta, za pomocą której importować będziemy niezbędny nam moduł UpdateServices. By uniknąć powielania kodu, skorzystamy z tego, że klasy w PowerShellu wspierają (w ograniczonym zakresie) dziedziczenie.


Klasa nadrzędna i metody standardowe


Stworzymy klasę nadrzędną zawierającą wspomnianą właściwość i metody, a oba zasoby będą po tej klasie dziedziczyć:


class Wsus {
[object]$WsusServer
[void] ImportWsusServerModule () {
Import-Module -Name UpdateServices -ErrorAction Stop -Verbose:$false
}
[object] GetWsusServer () {
if ($this.WsusServer) {
return $this.WsusServer
}
$this.WsusServer = Get-WsusServer -ErrorAction Stop
return $this.WsusServer
}
}
[DscResource()]
class WsusComputerGroup : Wsus {
}
[DscResource()]
class WsusComputerGroupMember : Wsus {
}


Mamy gotowy szkielet i właściwości – zacznijmy implementować wymagane metody.


Metoda Get musi jedynie odszukać grupę, która nas interesuje, oraz pobrać informację o grupie nadrzędnej. Jeśli grupy nie uda się znaleźć, to oczywiście metoda Get poinformuje nas o tym, ustawiając wartość właściwości Ensure na Absent:


[WsusComputerGroup] Get () {
$this.ImportWsusServerModule()
$this.GetWsusServer()
$allComputerGroups = $this.WsusServer.GetComputerTargetGroups()
$this.Group = $allComputerGroups | Where-Object {$_.Name -eq $this.Name}
if ($this.Group) {
$parentGroupObj = $this.Group.GetParentTargetGroup()
return [WsusComputerGroup]@{
Name = $this.Group.Name
Parent = $parentGroupObj.Name
Ensure = [Ensure]::Present
WsusServer = $this.WsusServer
Group = $this.Group
}
} else {
return [WsusComputerGroup]@{
Name = $this.Name
Parent = $this.Parent
Ensure = [Ensure]::Absent
WsusServer = $this.WsusServer
Group = $null
}
}
}

 

[...]

 

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.

prenumerata Numer niedostępny Spis treści

.

Transmisje online zapewnia: StreamOnline

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