Часто задаваемый вопрос: как сделать, чтобы при возникновении проблем на Windows компьютере отправлялось смс сообщение администратору с указанием компьютера и кратким описанием проблемы.
В этой статье рассматривается один из вариантов решения этой задачи.
Наш WSH JScript скрипт диагностирует:
- переполнение логических дисков (менее 15% свободного места),
- деградацию физических дисков (статус любой, кроме «OK»),
- переполнение памяти (выделено более 85%),
- перегрузку по процессору (загрузка более 85%)
Для диагностики скрипт использует Win32 Classes из WMI. Подробнее можно посмотреть:
Считывание информация о дисках
Определение загрузки процессора,
Размер выделенной памяти
/* check-n-send.js Этот скрипт проверяет некоторые показатели производительности компьютера и, если выявлены ситуации, требующие внимания администратора, отправляет ему предупреждение по смс. Предполагается, что программа NHSMS установлена на компьютере, и необходимые пути прописаны в %PATH% */ // Пороговые значения var disk_free_limit = 15; // свободное место на логическом диске, %% var drive_status_ok = "OK"; // статус физического диска должен быть OK var memory_usage_limit = 85; // максимальный расход памяти, %% var cpu_total_percent_limit = 85; // максимальная загрузка процессора, %% function check_computer(computer_name) { var error_text = ""; var wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\"+ computer_name+"\\root\\cimv2"); var gb = 1024*1024*1024; // Logical disks var disks = wmi.ExecQuery("select * from Win32_LogicalDisk where DriveType=3"); var e = new Enumerator(disks); for (; !e.atEnd(); e.moveNext()){ var size_gb=e.item().Size/gb; var free_space_gb=e.item().FreeSpace/gb; var free_percentage = free_space_gb * 100 / size_gb; WScript.Echo(e.item().DeviceID + " "+ size_gb.toFixed(1)+"GB "+ free_space_gb.toFixed(1)+"GB" + " (" + free_percentage.toFixed(1) + "%)" + " " + e.item().FileSystem); if (free_percentage < disk_free_limit) error_text += "Disk " + e.item().DeviceID + " full (" + free_percentage.toFixed(1) + "% free). "; } // Physical drives var drives = wmi.ExecQuery("select * from Win32_DiskDrive"); e = new Enumerator(drives); for (; !e.atEnd(); e.moveNext()){ var size_gb = e.item().Size/gb; WScript.Echo(e.item().DeviceID+ " " + size_gb.toFixed(1) + "GB "+ " " + e.item().Status); if (e.item().Status != drive_status_ok) error_text += "Drive " + e.item().DeviceID + " " + e.item().Status +"). "; } // memory var m = wmi.ExecQuery("select * from Win32_PerfFormattedData_PerfOS_Memory"); e = new Enumerator(m); var memory_usage = e.item().PercentCommittedBytesInUse; if (memory_usage > memory_usage_limit) error_text += "CPU overload (" + cpu_total_percent + "%). "; WScript.Echo("Memory usage " + memory_usage + "%"); // CPU var p = wmi.ExecQuery("select * from Win32_PerfFormattedData_PerfOS_Processor where Name='_Total'"); e = new Enumerator(p); var cpu_total_percent = e.item().PercentProcessorTime; WScript.Echo("CPU load " + cpu_total_percent + "%"); if (cpu_total_percent > cpu_total_percent_limit) error_text += "CPU overload (" + cpu_total_percent + "%). "; return error_text; } var error_text = ""; var computer_name = "."; try { error_text = check_computer(computer_name); } catch (e) { // Если не удаётся получить информацию error_text = "Failed. "; } if (error_text.length) { // если есть ошибки... WScript.Echo(error_text); // Запускаем NHSMS: nhsmscl.exe через Exec, чтобы видеть её вывод. Если // это не требуется, можно запускать и через Run() var wsh_shell = WScript.CreateObject("WScript.Shell"); var nhsms = wsh_shell.Exec("nhsmscl.exe " + error_text); while (!nhsms.StdOut.AtEndOfStream) { var line = nhsms.StdOut.ReadLine(); WScript.Echo(line); } }
В скрипте производится перехват исключения, возникающего во время опроса компьютера. Соотвественно, проблемы с сетью, электропитанием и т.п. также будут зафиксированы и переданы по смс администратору.
Программа nhsms должна быть установлена на компьютере, путь к ней должен быть прописан в %PATH%, также должен быть правильно настроен nhsms.ini
:
- необходимо задать телефон администратора как телефонный номер по умолчанию, чтобы не указывать его каждый раз в командной строке,
- желательно указать большое количество попыток подключения к модему с паузой в 5-10 секунд, чтобы программа nhsms повторяла попытку подключения, если модем занят другой программой.
Подробнее см. Справка nhsms
Чтобы видеть весь вывод, запускаем скрипт как cscript //nologo check-n-send.js
. После отладки можно убрать вызовы WScript.Echo() и запускать через wscript или же Скрыть консольное окно.
Скрипт можно запускать вручную или из Расписания Windows (Windows Scheduled Tasks).
Скрипт проверен в Windows 7 x64.
Возможное развитие скрипта:
- добавить контроль таких объектов, как число процессов, число потоков (threads), число дескрипторов (handles), число объектов GDI для выявления ситуации перерасхода системных ресурсов.
- диагностировать группу компьютеров по списку (например, из файла или из базы данных домена) в цикле.
Этот и другие скрипты можно скачать по ссылке