Мне было интересно, есть ли простой способ вызвать оповещение по электронной почте в Windows Server 2008, когда на любом разделе логического диска становится мало места. У меня есть 2 сервера SQL, которые почти закончили из-за файлов журнала БД.
Спасибо Райан
Ответы:
Один простой способ заставить Windows Server 2008 отправлять оповещения по электронной почте о нехватке места на диске - это использовать планировщик задач и системный журнал. Если свободное пространство падает ниже процента, указанного в HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold , в системном журнале записывается событие, которое может вызвать задачу для отправки сообщения электронной почты.
источник
powershell
программу и-command &{send-mailmessage -from server@domain.org -to notify@domain.com -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}
Я добавил мониторинг дискового пространства через snmp в мой (отдельный) экземпляр nagios.
источник
Почему бы вам не запускать скрипт powershell как задачу по расписанию каждый день? Если скрипт обнаружит, что свободное место на диске меньше 10%, он отправит вам электронное письмо или уведомление.
Вот пример кода для проверки свободного места на дисках:
Get-Content ForEach-Object {$ ; Get-WMIObject - имя_компьютера $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}
источник
Оба примера не работают из-за неправильного синтаксиса PowerShell. В следующем коде перечислены размеры томов текущего хоста (с помощью PowerShell 5.0):
В следующем коде перечислены размеры томов хостов, перечисленных в server.txt :
Примечание
Обратите внимание, что внешний заполнитель
$_
перечисляет адреса сервера, тогда как внутренний заполнитель$_
перечисляет устройства. Это частая ошибка для новичков в PowerShell. Если вы хотите использовать адрес сервера во внутреннем цикле, вам нужно будет присвоить его новой переменной во внешнем цикле.Программное обеспечение форума, используемое здесь, имеет недостатки. В предварительном просмотре он отображается
$_
правильно,$_
даже если не экранирован как код. Но последний пост удаляет подчеркивание, что делает примеры PowerShell некорректными.источник
Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }
но, будучи новичком PS, я не совсем понимаю, каким будет следующий шаг, чтобы автоматизировать это (например, как взять вывод из первой команды, и если диск был ниже некоторого пробела, подключите команду PS для отправки и отправки электронной почты. Я вижу, что электронная почта может быть отправлена с поста вышеупомянутым boadad, используя,-command &{send-mailmessage ...
но не знаю, как связать вашу логику, которая требует, чтобы места было мало, нужно отправлять почту Thx.Вы можете использовать этот скрипт, чтобы отправить электронное письмо на ваш почтовый сервер. Просто замените имя сервера SMTP на имя вашего сервера. Если на той же машине используется localhost (сервер smtp должен быть работоспособен). Сценарий также находится здесь: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65
После сохранения сценария на локальном диске его можно легко запустить с помощью powershell и протестировать. Если сценарий работает нормально, его можно запускать каждый день или каждый час в зависимости от требований с помощью планировщика задач Windows. В этой статье объясняется, как запустить скрипт с помощью планировщика задач. https://www.metalogix.com/help/Content%20Matrix%20Console/SharePoint%20Edition/002_HowTo/004_SharePointActions/012_SchedulingPowerShell.htm
источник
Я исправил сценарий. Просто создайте текстовый файл с именем, например, server.txt и включите IP-адрес или имя сервера, а затем вы можете выполнить следующий скрипт
Get-Content server.txt | foreach-object {Get-WmiObject -ComputerName 192.168.22.208 win32_logicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}
С уважением, Луис.
источник
Get-Content server.txt | foreach-object {Get-WmiObject -ComputerName xx.xx.xx.xx win32_logicalDisk -filter "DriveType = 3" | forEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}
источник