Рулим форточками через PHPНаходясь далеко от консоли, часто возникает необходимость в удаленном управлении машиной. Посмотреть работающие процессы, завершить сеанс пользователя, перезапустить зависший демон, запустить скрипт или перезагрузить хост. Для удаленного управления форточками на сегодня существует стандартное подключение к удаленному рабочему столу по протоколу RDP и множество ПО от сторонних производителей. Однако эти способы требуют отдельного подключения к каждому управляемому объекту, а также установки на них серверных частей, что зачастую блокируется антивирусным ПО (впрочем, о чем это я, ведь мы планируем управлять исключительно своей личной машиной?). Но при подключении к своему компьютеру с помощью публичной точки доступа вероятен облом — некоторые порты TCP могут быть запрещены. Выход из этой ситуации я нашел в решении построить web-сайт, который будет размещен либо на управляемой машине, либо на любой машине домена, на которой запущен сервер с админскими правами. Естественно, доступ к сайту ограничим паролем, а подключаться к нему будем по протоколу SSL. К делу!В качестве web-сервера применяется сборка "Денвер" (джентльменский набор web-разработчика) с PHP интерпретатором версии 5.2. Развернем web-сервер на управляемой машине, либо на любой машине домена под учеткой с административными правами доменного админа. Денвер устанавливается крайне просто — на сайте разработчика есть подробная инструкция. В моём случае я просто установил диск с папками web-сервера как диск A, подключающийся при старте системы (флоппи-дисковода у меня нет и в BIOS он отключен). Каталог www, показанный на рисунке "Содержимое нашего каталога", будет содержать файлы (php-скрипты) нашей системы удаленного управления.
Для обеспечения безопасности доступа к сайту управления необходимо в каталоге WWW разместить файлы .htaccess и .htpasswd со следующим содержимым (для .htaccess):
Здесь мы прописываем тип аутентификации (базовая) и путь к файлу с паролями. Файл .htpasswd содержит зашифрованные пароли пользователей (файл создается с помощью утилиты htpasswd.exe из комплекта дистрибутива WEB-сервера Apache), вот пример его содержимого:
У меня используются два юзера — в дальнейшем первый имеет право на перезагрузку и отключение машин, а второй — не имеет. Если у тебя нет фиксированного IP-адреса, то для того, чтобы наш сайт управления был виден извне, необходимо зарегистрироваться на dyndns.com (либо аналогичном сайте, предоставляющем услугу динамического DNS), а затем в настройках маршрутизатора (например, для DLink при ADSL подключении) прописать полученный логин и пароль.
Для доступа снаружи на наш web-сервер необходимо также добавить IP-машины с сайтом в DMZ-зоне. Разбираем принцип работыТеперь расскажу о том, как осуществляется мониторинг либо управление машинами через наш сайт. Для этого мы используем подключение из PHP к подсистеме WMI виндовых машин посредством создания новых COM-объектов. WMI (инструментарий управления осями Windows) предоставляет нам возможность подключаться к следующим провайдерам:
Для вывода на web-страницу информации о текущем состоянии машины (память, процессы, службы), а также для выполнения некоторых административных действий необходимо написать функции, которые будут вызываться с параметрами (имя машины или IP-адрес), а затем выводить результат своей работы в соответствующее поле web-страницы. Самые интересные и используемые в рамках нашего проекта функции будут требовать обращения к провайдерам подсистемы Win32 и провайдеру реестра. Работаем с реестром удаленноНа сегодня у меня реализованы как мониторинговые, так и управляющие функции. Из мониторинговых стоит выделить функцию получения и вывода информации о версии BIOS, производителе и модели материнской платы. Данный функционал реализуется с помощью создания нового COM-объекта подключением к провайдеру StdRegProv подсистемы WMI. Все рассмотренные функции вызываются с переменной $server, которая содержит имя управляемой удаленной машины в локальной сети либо ее IP-адрес:
Таким образом, после создания нового COM-объекта методом getStringValue мы читаем раздел реестра HKLM (выбор раздела реестра задается константой, в нашем случае — объявлением define('HKLM',0x80000002);). При необходимости читать другие разделы реестра указываем другие константы:
В результате работы скрипт выводит нам следующие данные (в моем случае):
Кроме используемого метода getStringValue существуют дополнительные методы работы с провайдером StdRegProv, среди них:
В данном случае они не используются, а подробнее узнать об их применении можно в великом MSDN. Мониторим систему удаленноДля осуществления функций мониторинга системы потребуется работать с пространством имен WMI (/root/cimv2), что даст нам возможность обращаться к необходимым провайдерам Win32_Processor, Win32_OperatingSystem, Win32_PerfFormattedData_PerfOS_System, Win32_OperatingSystem, Win32_Process, Win32_Service. Итак, получаем информацию о центральном процессоре системы (CPU), включая его загрузку в процентах и данные CPUID, для этого сделаем так:
Здесь мы создаем новый COM-объект и, обращаясь к методам провайдера Win32_Processor, получаем нужную нам информацию:
Данные о температуре процессора мы можем получить, обратившись к пространству имен /root/WMI и провайдеру MSAcpi_ThermalZoneTemperature. Получение актуальной температуры CPU работает не на всех материнских платах ПК, зато прекрасно работает на ноутах. Работа с пространством имен /root/WMI и провайдером MSAcpi_ThermalZoneTemperature:
Здесь перед выводом на страницу мне пришлось перевести температуру из кельвинов в привычные русскому глазу единицы Цельсия. Двигаемся дальше и с помощью старого доброго пространства имен /root/cimv2 получаем информацию об установленной оси, сервис-паках и аптайме. Здесь использованы методы провайдеров Win32_OperatingSystem и Win32_PerfFormattedData_PerfOS_System. Для перевода секунд при отображении uptime используется функция format_time($temp). Выводим параметры OS’и и uptime:
Результаты работы наших скриптов:
Таким образом, с помощью языка PHP в связке с WMI мы можем получать любую информацию о ПК удаленно. Рулим виндами удаленноДля реализации перезагрузки ПК необходимо обратиться к пространству имен /root/cimv2 и вызвать метод Reboot провайдера Win32_OperatingSystem. Для завершения работы необходимо вызвать метод ShutDown. Удаленная перезагрузка системы:
Для просмотра запущенных служб:
Для просмотра процессов:
Для запуска или остановки служб используем методы StartService и StopService объекта Win32_Service:
А вот для запуска процессов придется использовать метод Create объекта win32_process:
ЗаключениеТаким образом, используя все возможности WMI-провайдеров из PHP, можно получать и публиковать на web-сайте любую информацию об удаленных машинах, а также практически без ограничений ими управлять, манипулируя процессами, службами и реестром. В рамках статьи показаны лишь наиболее простые варианты применения связки PHP и WMI для удаленного мониторинга и управления Windows-системами. В исходниках ты найдешь пример получения PTR (pointer) записей домена (файл dns_ptr.php), реализованный с помощью использования пространства имен /root/MicrosoftDNS и провайдера MicrosoftDNS_PTRType. Вся эта система у меня реализована в виде web-сайта с подключаемыми модулями-функциями.
В общем, теперь все рычаги управления Windows-системами c помощью php-интерпретатора в твоих руках — пользуйся, но не в деструктивных целях! |