Zastanawiałem się, czy istnieje prosty sposób na wywołanie powiadomienia e-mail w systemie Windows Server 2008, gdy na partycjach dysku logicznego zabraknie miejsca. Mam 2 serwery SQL, którym prawie brakuje miejsca na dysku z powodu plików dziennika DB.
Dzięki, Ryan
Odpowiedzi:
Jednym z prostych sposobów, aby system Windows Server 2008 wysyłał powiadomienia e-mail o małej ilości miejsca na dysku, jest użycie Harmonogramu zadań i Dziennika systemu. Jeśli ilość wolnego miejsca spadnie poniżej wartości procentowej określonej w HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold , w dzienniku systemowym rejestrowane jest zdarzenie, które może uruchomić zadanie wysłania wiadomości e-mail.
źródło
powershell
program i następujące argumenty:-command &{send-mailmessage -from [email protected] -to [email protected] -subject 'Alert from Task Scheduler' -body 'This is an automated message from a task scheduled on the server. Testing powershell email.' -smtpserver x.x.x.x}
Dodałem monitorowanie miejsca na dysku przez snmp do mojej (oddzielnej) instancji nagios.
źródło
Dlaczego codziennie nie uruchamiasz skryptu PowerShell jako zadania harmonogramu? Jeśli skrypt wykryje, że wolne miejsce na dysku jest mniejsze niż 10%, wyśle Ci wiadomość e-mail lub powiadomienie.
oto przykładowy kod do sprawdzania wolnego miejsca na dyskach:
Get-Content ForEach-Object {$ ; Get-WMIObject –nazwa_komputera $ Win32_LogicalDisk -filter „DriveType = 3” | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}
źródło
Oba przykłady nie działają z powodu niepoprawnej składni programu PowerShell. Poniższy kod wyświetla rozmiary woluminów bieżącego hosta (przy użyciu programu PowerShell 5.0):
Poniższy kod zawiera listę rozmiarów woluminów hostów wymienionych w server.txt :
Dygresja
Zauważ, że zewnętrzny symbol
$_
zastępczy wylicza adresy serwerów, podczas gdy wewnętrzny symbol$_
zastępczy wylicza urządzenia. To częsty problem dla początkujących PowerShell. Jeśli chcesz użyć adresu serwera w wewnętrznej pętli, musisz przypisać go do nowej zmiennej w zewnętrznej pętli.Użyte tutaj oprogramowanie forum jest wadliwe. W podglądzie wiadomości wyświetla się
$_
poprawnie jako$_
nawet, jeśli nie jest poprzedzony kodem. Ale ostatni post usuwa znak podkreślenia, przez co przykłady PowerShell są niepoprawne.źródło
Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }
ale będąc początkującym PS, nie bardzo rozumiem, jaki byłby następny krok, aby to zautomatyzować (na przykład, jak wziąć dane wyjściowe z pierwszego polecenia i jeśli dysk był poniżej pewnego progu miejsca, połącz polecenie PS, aby wysłać i wysłać e-mailem. Widzę, że e-mail może zostać wysłany z postu przez boadad powyżej przy użyciu,-command &{send-mailmessage ...
ale nie jestem pewien, jak połączyć twoje z logiką, która dyktuje, że jest mało miejsca, należy wysłać pocztę , DziękiMożesz użyć tego skryptu, aby wysłać wiadomość e-mail za pomocą serwera e-mail. Wystarczy zastąpić nazwę serwera smtp nazwą serwera. Jeśli na tym samym komputerze, użyj „localhost” (serwer smtp musi działać). Skrypt znajduje się tutaj: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65
Po zapisaniu skryptu na dysku lokalnym można go łatwo uruchomić za pomocą programu PowerShell i przetestować. Gdy skrypt wydaje się działać poprawnie, można zaplanować jego uruchamianie codziennie lub co godzinę, w zależności od wymagań, za pomocą harmonogramu zadań systemu Windows. W tym artykule wyjaśniono, jak uruchomić skrypt za pomocą harmonogramu zadań. https://www.metalogix.com/help/Content%20Matrix%20Console/SharePoint%20Edition/002_HowTo/004_SharePointActions/012_SchedulingPowerShell.htm
źródło
Naprawiłem skrypt. Wystarczy utworzyć plik tekstowy o nazwie na przykład server.txt i podać adres IP lub nazwy serwerów, a następnie można wykonać następujący skrypt
Get-Content server.txt | foreach-object {Get-WmiObject -ComputerName 192.168.22.208 win32_logicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}
Pozdrawiam, Luis.
źródło
Get-Content server.txt | foreach-object {Get-WmiObject -ComputerName xx.xx.xx.xx win32_logicalDisk -filter "DriveType = 3" | forEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}
źródło