Часто задаваемый вопрос: как сделать, чтобы при возникновении проблем на 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 для выявления ситуации перерасхода системных ресурсов.
  • диагностировать группу компьютеров по списку (например, из файла или из базы данных домена) в цикле.

Этот и другие скрипты можно скачать по ссылке

Проверка компьютера с отправкой смс
Метки:         

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *