Spotkania grup offline

Biuletyny zabezpieczeń

Microsoft w Polsce

Statystyka

  • W tej chwili mamy:
    177 czytelników online
    117 191 zarejestrowanych
  • Do dziś zanotowaliśmy:
    121 684 684 odsłon
    14 496 odsłon / 24h
Microsoft Most Valuable Professional

Monitorowanie serwerów Exchange za pomocą PowerShell i WMI

  • Data publikacji: 2010-01-04 21:42|
  • Odsłon: 2263|
  • Dodał: Łukasz Foks|
  • Odbiorcy: IT PRO|

  • Poziom trudności: Średiozaawansowany|
  • Komentarze (3)

Niniejszy artykuł ma na celu zaprezentowanie możliwości monitorowania serwerów Exchange za pomocą Microsoft Windows PowerShell oraz Windows Management Instrumentation. Skorzystanie z tych narzędzi jest alternatywą, gdy aplikacje zapewniające monitorowanie serwerów Exchange są dla nas zbyt drogie lub nie dostarczają oczekiwanych informacji. W takim przypadku możemy posłużyć się właśnie PowerShell oraz WMI.

PowerShell został opublikowany wraz z Exchange Server 2007. Jest również do pobrania i zainstalowania w systemach: Windows Server 2003 SP1, Windows XP SP2, Windows Vista.

Usługa WMI to rodzaj implementacji WBEM (ang. Web Based Enterprise Management Initiative), inicjatywy ustanowienia standardów ujednolicania zarządzania środowiskami IT. Umożliwia zarządzanie zasobami komputera lokalnego i uzyskiwanie informacji o nim, a także dostęp do zarządzanych elementów komputera zdalnego, czyli takiego, do którego musimy połączyć się przez sieć komputerową. Przykładowymi zasobami, do których możemy uzyskać dostęp, są: rejestr i system plików, sterowniki systemowe, zainstalowane urządzenia. W niniejszym artykule chciałbym pokazać, jak w prosty sposób napisać własne skrypty do monitorowania serwerów Exchange.

Wstęp do Windows Management Instrumentation (WMI)

Czym jest PowerShell, każdy administrator serwerów Exchange 2007 już wie, ale WMI? Windows Management Instrumentation dostępny jest w systemach operacyjnych Microsoft od wersji Windows NT 4.0. Usługę tę można porównać do Active Directory lub systemu plików ze względu na hierarchiczną przestrzeń nazw, która stanowi sposób na uporządkowanie danych dotyczących podobnych elementów i składa się z: dostawców, klas i obiektów.

Oto kilka przykładów zadań, które można wykonać za pomocą WMI:

  • uzyskać informacje o napędach dyskowych,
  • uzyskać informacje o parametrach pamięci operacyjnej (fizycznej i wirtualnej),
  • przeglądać podgląd zdarzeń,
  • przeglądać i modyfikować rejestry systemowe,
  • utworzyć zdarzenia w harmonogramie zadań.

Sprawdzanie ogólnych właściwości systemowych

Zacznijmy od sprawdzenia parametrów systemu operacyjnego, takich jak zajętość dysków oraz analiza logów znajdujących się w Podglądzie Zdarzeń. Wymienione dalej polecenia można stosować zarówno w systemach operacyjnych Windows Server 2003, jak i Windows Server 2008.

Sprawdzanie zajętości dysków

WMI i PowerShell znakomicie nadają się do ustalania wolnego miejsca na dyskach logicznych. Sprawdzenie ich pojemności wymaga skorzystania z klasy win32_logicaldisk znajdującej się w przestrzeni nazw Root/CIMV2.

get-WMIobject -class win32_logicaldisk

Przestrzeń nazw Root/CIMV2 jest domyślna, nie musimy już jej podawać przy wywoływaniu polecenia Get-wmiobject.

Jeśli chcielibyśmy wyświetlić tylko napędy, na których zostało mniej niż 1 GB wolnego miejsca, możemy skorzystać z kwerendy WQL, która ograniczy rezultat wyszukania:

get-WMIobject -query „Select DeviceID,FreeSpace from win32_logicaldisk where FreeSpace<=1073741824 and drivetype=3" | format-table DeviceID,FreeSpace

Właściwość drivetype o wartości 3 ogranicza rezultat wyszukania do napędów lokalnych.

Jak widać, kwerenda WQL ma składnię bardzo podobną do znanej z T-SQL.

Ważną cechą polecenia get-wmiobject jest to, że umożliwia odpytanie także innych maszyn.

Podane dalej polecenie umożliwi nam sprawdzenie, które dyski lokalne (DriveType=3) na serwerze „InnyServer.domena.pl" mają mniej niż 1 GB wolnej przestrzeni:

Get-wmiobject -query „Select DeviceID,FreeSpace from win32_logicaldisk where FreeSpace<=1073741824 and DriveType=3" -computer InnyServer.domena.pl

Sprawdzanie logów Podglądu Zdarzeń

Czy za pomocą PowerShell można pobierać zdarzania z Podglądu Zdarzeń zarówno z komputera lokalnego, jak i komputerów zdalnych? Można!

Do odczytania logów z Podglądu Zdarzeń posłuży nam klasa: win32_ntlogevent.

Zacznijmy od czegoś prostego. Dzięki następującemu poleceniu zobaczymy wszystkie zdarzenia typu: „Błąd" z logu aplikacyjnego:

Get-wmiobject -query „Select * from win32_ntlogevent where type='Error' and logFile='Application'"

Jeśli chcielibyśmy wyświetlić błędy, które wystąpiły na serwerze InnyServer.domena.pl w ciągu ostatnich 3 dni, możemy użyć polecenia get-date. Wczytujemy aktualną datę, a potem za pomocą metody adddays odejmujemy od niej 3 dni. Następnie konwertujemy tak uzyskaną datę na format akceptowany w kwerendach WQL:

#Wczytujemy biezaca date
$date=get-date
#Oddejmujemy 3 dni
$date=$date.adddays(-3)
#Konwertujemy format daty do formatu akceptowanego w kwerendzie WQL
$BeginDate=[System.Management.ManagementDateTimeConverter]::ToDMTFDateTime($date)
Get-wmiobject -query "Select * from win32_ntlogevent where type='Error'
and LogFile='Application' and TimeGenerated>='$BeginDate'" -computer InnyServer.domena.pl

Monitorowanie Exchange 2003

W Exchange 2003 nie mamy do dyspozycji wbudowanych poleceń, tak jak w Exchange 2007, ale możemy skorzystać z klas WMI. Po zainstalowaniu Exchange 2003 utworzona zostaje przestrzeń nazw Root\MicrosoftExchangev2. W domyślnej konfiguracji członkowie grupy Administratorzy mają uprawnienia tylko do jej odczytu, ale do monitorowania Exchange 2003 w zupełności nam to wystarczy. W celu wyświetlenia listy wszystkich klas znajdujących się w tej przestrzeni nazw użyjemy polecenia:

get-wmiobject -namespace root\MicrosoftExchangev2 -list

Sprawdzanie kolejek pocztowych

Korzystając z WMI, możemy sprawdzić stan kolejek SMTP na serwerze Exchange 2003 za pomocą klasy Exchange_SMTPQueue.

get-wmiobject -namespace root\MicrosoftExchangev2 -class Exchange_SMTPQueue

W celu wyświetlenia niepustych kolejek trzeba skorzystać z kwerendy WQL i warunku MessageCount!=0.

$Queues=get-wmiobject -namespace root\MicrosoftExchangev2 -query "Select * from Exchange_SMTPQueue where MessageCount!=0" $Queues | Select-object QueueName,MessageCount,Size,Status,VirtualMachine

Sprawdzanie statusu zasobów klastrowych

Do sprawdzania statusu zasobów klastrowych i wyświetlania tych, które są w stanie „Offline" lub „Failed", służy klasa ExchangeClusterResource znajdująca się w przestrzeni nazw Root\CIMV2\Applications\Exchange.

Do zmiennej $klaster wczytamy stan zasób klastrowych klastra klaster.domena.pl.

$klaster=get-wmiObject -namespace root\CIMV2\Applications\Exchange -computer klaster.domena.pl -class ExchangeClusterResource

Następnie wyświetlimy te, których stan nie jest „Online".

$klaster | where-object {$_.State -ne "2"} | sort-object -property Owner,VirtualMachine,Name

Sprawdzanie pamięci Non Paged Pool

Serwery Exchange 2003 pracują tylko na 32-bitowych systemach operacyjnych. Sprawia to, że ilość pamięci, jaką może zaadresować procesor, jest bardzo ograniczona. Ponadto, jeżeli plik boot.ini zawiera przełącznik /3GB, to wirtualna przestrzeń adresowa do użycia w trybie jądra zostanie ograniczona do 1 GB, a rozmiar pamięci niestronicowanej (Non Paged Pool) - do 128 MB. Na bardzo mocno obciążonych serwerach lub pracujących ze starymi sterownikami może wystąpić całkowite wyczerpanie pamięci Non Pool Page. Prowadzi to do awarii i zatrzymania IISa, a następnie do zatrzymania Information Store. W celu śledzenia stanu pamięci niestronicowanej ponownie skorzystamy z WMI oraz z klasy Win32_PerfFormattedData_PerfOS_Memory znajdującej się w domyślnej przestrzeni nazw.

Na początek do zmiennej $ExchServers przypiszemy nazwy wszystkich serwerów Exchange, dla których chcemy śledzić stan pamięci niestronicowanej.

$ExchServers="ExchServer1.domena.pl","ExchServer2.domena.pl","ExchServer3.domena.pl"

Do zmiennej $wmiquery przypiszemy kwerendę WMI, której użyjemy do odczytania parametrów pamięci operacyjnej serwera. Proszę zwrócić uwagę, że właściwość __SERVER zawiera w nazwie dwa podkreślenia.

$wmiquery="Select __SERVER,PoolNonPagedBytes from Win32_PerfFormattedData_PerfOS_Memory"

W zmiennej $npp zapiszemy rezultat polecenia get-wmiobject.

$npp=get-wmiobject -query $wmiquery -computername $ExchServers

Następnie wynik posortujemy według wartości PoolPagedBytes i zmienimy nazwę kolumny __Server na „Nazwa Serwera".

$npp |sort-object PoolNonPagedBytes | select-object @{Name="Nazwa Serwera"; Expression={$_.__server}}, PoolNonPagedBytes

Monitorowanie Exchange 2007

W Exchange 2007 możemy skorzystać z Exchange Management Shell, czyli powłoki PowerShell rozbudowanej o polecenia przeznaczone do wykonywania wszelkich zadań administracyjnych związanych z programem Exchange 2007.

Sprawdzanie kolejek pocztowych

W Exchange 2007, inaczej niż w Exchange 2003, wiadomości znajdujące się w kolejkach pocztowych trafiają do bazy danych ESE (ang. Extensible Storage Engine), gdzie oczekują na dalsze przesłanie lub dostarczenie do skrzynek. Ponadto w Exchange 2007 nie istnieją klasy WMI, które umożliwiają skontrolowanie stanu kolejek pocztowych. Dlatego w tej wersji Exchange możemy sprawdzić stan kolejek za pomocą polecenia get-queue.

Jeśli chcemy skontrolować kolejki pocztowe na wszystkich zainstalowanych w firmie serwerach Exchange 2007 Hub lub Edge i wyświetlić te, które zawierają przynajmniej jedną wiadomość, możemy skorzystać z polecenia:

get-transportserver | get-queue | where-object {$_.MessageCount -ne "0"}

Sprawdzanie wykonania backupów

Podczas wykonywania kopii zapasowej Exchange jednym z zadań, oprócz usunięcia logów transakcyjnych, jest uaktualnienie nagłówka bazy danych skrzynek pocztowych polegające na wstawieniu daty ostatniego poprawnie wykonanego backupu. Na tej podstawie możemy stwierdzić, czy kopia zapasowa została wykonana poprawnie.

Po pierwsze musimy zdefiniować próg czasowy, po którym stwierdzimy, że backup nie przebiegł poprawnie. Jeśli pełny backup wykonujemy codziennie, takim progiem będzie jeden dzień:

$startTime=get-date $backupcheckthreshold=$startTime.adddays(-1)

Następnie do zmiennej $mailboxdb wczytujemy wszystkie bazy danych skrzynek pocztowych znajdujące się w naszej firmie na serwerach typu Mailbox.

$mailboxdb=get-exchangeserver | where-object {$_.ServerRole -eq "Mailbox"} | get-mailboxdatabase -Status

Kolejnym krokiem będzie sprawdzenie w pętli While, czy data zapisana we właściwości LastFullBackup obiektu bazy danych skrzynek pocztowych nie jest starsza niż jeden dzień. Jeśli jest starsza, nazwę bazy oraz wartość LastFullBackup zapiszemy w formacie HTML w pliku rezultat.html.

while ($mailboxdb[$i].Name.length -gt 0)
      {
      if ($backupcheckthreshold -gt $mailboxdb[$i].LastFullBackup)
            {
            $databasename=$mailboxdb[$i].name
$mailboxdb[$i] | Select-Object name,LastFullBackup | convertTo-HTML --body "<Font Face=Arial><H2>Ostatni pelny backup jest starszy niż 1 dzień dla bazy: $databasename</H2></Font>" |
            Add-Content c:\temp\rezultat.html
            }
      $i++
      }

Sprawdzanie poprawności działania zasobów klastrowych

Jeśli chcemy sprawdzić stan zasobów klastrowych na wszystkich serwerach w organizacji Exchange, możemy za pomocą polecenia get-exchangeserver wczytać sklastrowane serwery do zmiennej, a następnie sprawdzić stan ich zasobów klastrowych za pomocą polecenia get-clusteredmailboxserverstatus. Wynik w formacie HTML zapiszemy w pliku rezultat2.html.

$ExchMailboxSrv=Get-ExchangeServer | where-object {$_.ServerRole -eq "Mailbox" -and $_.IsMemberOfCluster -eq "Yes"}
$i=0
while ($ExchMailboxSrv[$i].name.length -gt 0)
{
      $ExchClusterElement=$ExchMailboxSrv[$i].name
     
Get-ClusteredMailboxServerStatus $ExchClusterElement | select-object Identity,State,OperationalMachines,FailedResources |
convertTo-HTML  -Body "<Font Face=Arial><H2>Status zasobów klastrowych Exchange</H2></Font>" | Add-Content C:\temp\rezultat2.html
      $i++
}

Sprawdzanie dostępności Outlook Web Access

Polecenie Test-OWAConnectivity może zostać użyte do zweryfikowania poprawnego działania Outlook Web Access. Test-OWAConnectivity służy do testowania połączeń z wszystkimi wirtualnymi katalogami zainstalowanymi na serwerze Client Access oraz konkretnymi URL. By przeprowadzić testy, musimy posiadać konta w Active Directory oraz testową skrzynkę na serwerze Mailbox.

W przykładzie, który podajemy dalej, zaprezentowana została metoda weryfikacji poprawności działania OWA na kilku serwerach Client Access, które są w firmie. Skrypt po uruchomieniu nie będzie wymagał interwencji użytkownika, gdyż użyje zakodowanych wcześniej poświadczeń. Rezultat zapiszemy w tabeli utworzonej w HTML.

Gdy się upewnimy, że mamy założoną skrzynkę pocztową z kontem użytkownika, powinniśmy zadbać, by w bezpieczny sposób zapisać nasze poświadczenia: hasło i nazwę użytkownika.

W tym celu wygenerujemy plik z zakodowanym hasłem, które będzie służyć do logowania się do skrzynki. Poleceniem read-host -assecurestring wczytamy z konsoli do obiektu typu System.Security.SecureString podane hasło. Następnie obiekt ten przekonwertujemy za pomocą polecenia convertFrom-securestring do typu System.String, który umożliwi zapisanie go w pliku poleceniem out-file.

read-host -assecurestring | convertfrom-securestring | out-file c:\temp\password.txt

W pliku password.txt mamy teraz zakodowane hasło użytkownika, którym będziemy się logować do skrzynki.

Kolejny krok to utworzenie tabeli, w której umieścimy wyniki naszych testów Outlook Web Access.

W tym celu tworzymy plik tabela.csv, który wczytamy w naszym skrypcie. Import pliku csv poleceniem import-csv spowoduje utworzenie tabeli z nagłówkami o wymaganym rozmiarze. Plik tabela.csv może mieć np. taką zawartość:

URL,Rezultat,Blad
"","",""
"","",""
"","",""
"","",""

Gdy mamy już przygotowane wszystkie elementy, które będziemy wykorzystywać w naszym skrypcie, łączymy je w całość.

Wczytujemy naszą tabelę do zmiennej $table:

$table=import-csv c:\temp\tabela.csv

Następnie tworzymy obiekt z poświadczeniami, których będziemy używać do zalogowania się do skrzynki pocztowej. Obiekt będzie się składał z nazwy użytkownika i hasła.

Do zmiennej $user wczytujemy nazwę użytkownika:

$user = "Domena\test-mailbox"

A do zmiennej $userpwd - zakodowane hasło użytkownika:

$userpwd = (get-content "c:\temp\password.txt") | ConvertTo-SecureString

Kolejnym krokiem będzie tworzenie obiektu z naszymi poświadczeniami:

$userCredentials = new-object -typename system.management.automation.pscredential -argumentlist $user,$userpwd 

Do zmiennej $URL wczytujemy listę naszych URL do przebadania:

$URL="https://xchcas01.domena.pl/owa",'
"https://xchcas02.domena.pl/owa",'
"https://xchcas03.domena.pl/owa",'
https://xchcas04.domena.pl/owa"

Następnie tworzymy główną pętlę skryptu, w której dla kolejnej wartości ze zmiennej $URL będziemy wykonywać polecenie test-owaconnectivity, a rezultat zapisywać w zmiennej $test:

$i=0
Foreach ($URLid in $URL)
{
$test=Test-OwaConnectivity -url:$URLid -mailboxcredential: $userCredentials
#Do zmiennej $CAS wczytujemy URL, który testowaliśmy
      $CAS=$test.url.AbsoluteURI.toString()
# Wczytujemy do zmiennej $status rezultat testu
      $status=$test.result.value.toString()
#Do zmiennej $error wczytujemy komunikat błędu. Jeśli test zakończy się powodzeniem, ta zmienna będzie pusta
$error=$test.error
# Zmienne: $CAS,$status,$error wpisujemy do odpowiednich wierszy i kolumn w tabeli:
      $table[$i].url=$CAS
      $table[$i].rezultat=$status
      $table[$i].blad=$error
      $i++
}

Po wykonaniu pętli zawartość zmiennej $table eksportujemy do HTML:

$table | convertTo-HTML URL,Rezultat,Blad | Add-content
C:\temp\rezultat3.html

Oto przykładowy rezultat działania skryptu:

URL

Rezultat

Bład

https://xchcas01.domena.pl/owa

Success

 
     

https://xchcas02.domena.pl/owa

Success

 

https://xchcas03.domena.pl/owa

Success

 

https://xchcas04.domena.pl/owa

Failure

The test encountered an error while logging on to Outlook Web Access. Outlook Web Access Error Page: Error message: Outlook Web Access is not currently available for the user mailbox that you are trying to access. If the problem continues, contact technical support for your organization and tell them the following: The Microsoft Exchange Client Access server that is proxying the Outlook Web Access requests is running an older version of Microsoft Exchange than the Client Access server in the mailbox Active Directory site. Request URL: Exception Type: Exception message:

Podsumowanie

To tylko wybrane przykłady parametrów serwerów Exchange, które można monitorować za pomocą PowerShell. Dzięki WMI da się w zasadzie oskryptować monitorowanie każdego licznika dostępnego w Peformance Monitor. Wbudowane w Exchange Management Shell polecenia zapewniają weryfikowanie poprawności działania usług systemowych, symulowanie połączeń z usługami Exchange oraz sprawdzanie jego parametrów wydajnościowych.

Całość można połączyć w rozbudowane skrypty PowerShell, które będą czytelnie prezentować stan naszych serwerów Exchange. Za pomocą PowerShell możemy na przykład sprawdzić, czy kończy nam się miejsce na dysku, czy backup przebiegł poprawnie, w jakim stanie są zasoby klastrowe, a także zweryfikować poprawność działania Outlook Web Access. Rezultat działania skryptu możemy umieścić w bazie SQL lub zapisać w pliku HTML i wysłać go do swojej skrzynki e-mailem.

Zasoby dodatkowe

  • Ocena: 100,00% 0,00% (głosów: 6)
Autor

Komentarz


oloszy
Gość

wypowiedzi: 6
od: 2009-06-28

Monitorowanie serwer&#243;w Exchange za pomocą PowerShell i WMI 2010-01-07 (Cz) 11:14
jedna z najciekawszych i najbardziej pożądanych przeze mnie publikacji na WSS. Wielkie dzięki, dobra robota! (b)

pozdrawiam,
Olo
Zaloguj się, żeby odpowiedzieć

rysic
Gość

wypowiedzi: 4
od: 2009-01-13

Monitorowanie serwer&#243;w Exchange za pomocą PowerShell i WMI 2010-01-07 (Cz) 23:22
Ja bym do tego dołożył Nagiosa i wtedy mieli byśmy monitoring z prawdziwego zdarzenia :)
Zaloguj się, żeby odpowiedzieć

d0m3l
Ekspert WSS

wypowiedzi: 709
od: 2006-12-15
Będę na C2C 2010

Odp: Monitorowanie serwerów Exchange za pomocą PowerShell i WMI 2010-01-09 (So) 09:35
ja do monitorowania Exch mimo mojej wielkiej miłości do Nagiosa (używam na co dzień i jestem zachwycony) wolę SCOM-a

--
I was a PC, now I'm a server ;)
http://w-files.pl
Zaloguj się, żeby odpowiedzieć