Реестр Windows из PHP

Реестр Windows является просто иерархически структурированная база данных, в которой операционная система и другие приложения хранят важную информацию о конфигурации.

Все виды данных, хранящихся в реестре: профили пользователей, тип файла ассоциации, информацию об оборудовании, серийные номера, и многое другое. С тех пор как доступна функция расширения win32std, ваши приложения Windows на основе PHP получат доступ к реестру.

Расширение Win32std может быть загружено в качестве предварительно скомпилированных библиотек из Pierre. Просто поместите его в свою PHP- Ext папку обновить php.ini файл и перезапустить Apache, если необходимо. Отметим, что библиотеки которые вы загрузите являются 32-разрядными, так что если вы используете 64-разрядную сборку WampServer, вам придется, либо установить WampServer 32-разрядную сборку или попытаться скомпилировать библиотеку самостоятельно.

Реестр Layout

Реестр имеет репутацию темные, опасные и страшные места в операционной системе Windows. Это вероятно более преувеличенный страх, но все равно я повторю цитату Microsoft:

Перед внесением изменений в реестр, сделайте его резервную копию и убедиться, что вы понимаете, как восстановить его в случае возникновения проблем. Неправильное изменение может привести к серьезным проблемам, которые могут потребовать переустановки операционной системы.

Реестр Windows разделен на 5 основных групп, известных как keys:

  1. HKEY_CURRENT_CONFIG — ключ хранит информацию о аппаратных средствах компьютера, таких как разрешение монитора и настройки динамиков. Можно увидеть этот ключ сокращенно HKCC.
  2. HKEY_LOCAL_MACHINE — раздел содержит информацию о конфигурации машины, такие как принтеры, программное обеспечение и информацию сети. Ключ загружается, а затем записи из профиля пользователя переопределяют различные значения. Вы увидите это ключ сокращенно HKLM.
  3. HKEY_USERS — ключ содержит все профили для локальных учетных записей пользователей на машине. Такие вещи, как заставка пользователя, тема информации и другие настройки. У этого ключа аббревиатура HKU.
  4. HKEY_CLASSES_ROOT — ключ является псевдонимом, указывающий на HKEY_LOCAL_MACHINE\Software в котором хранится информация о файле ассоциаций и MIME-типы. Аббревиатура HKCR.
  5. HKEY_CURRENT_USER — ключ является псевдонимом, указывающий на профиль в HKEY_USERS для текущего пользователя. Вы увидите это ключ сокращенно HKCU.

Каждый раздел содержит подразделы, которые в свою очередь содержат другие подразделы, значения конфигурации.

Работа HKEY_CURRENT_USER достаточна для игр с несколькими сценариями CLI и sandbox. Для широкого применения данных системы используется только HKEY_LOCAL_MACHINE, когда вам удобно работать с разрешениями безопасности Microsoft. Понимание того, что является правильным для вашей ситуации, важно знать под какой учетной записью работает PHP, и создать ключи надлежащим образом.

к меню ↑

Оформление Sandbox

Я рекомендую создать специальный ключ для использования в скриптах ради безопасности, особенно, когда вы разрабатываете. Человеку свойственно ошибаться, и мы не хотим, чтобы вы случайно переписали что то важное. Организация является еще одной причиной для создания назначенного ключа. В реестре хранится много информации.

Для просмотра и редактирования реестра используется программа Microsoft. Чтобы создать нашу песочницу, перейдите в меню Пуск, введите regedit в строке поиска, и выберите regedit.exe в списке результатов, которое появляется.

В левой панели показана древовидная структура существующие ключи в то время как в правой панели отображаются значения, хранящиеся в них. Разверните узел HKEY_CURRENT_USER щелкните правой кнопкой мыши на программное обеспечение и выберите New > Key из всплывающего контекстного меню. Кроме того, мы могли бы также переключаться по дереву с помощью клавиш, так что программное обеспечение будет подсвечена и выберите New > Key из меню Edit. Заполнить имя и нажмите клавишу ввода.

Реестр Windows

Теперь у нас есть место для игры, позвольте мне познакомить вас с функциями манипулирования записями реестра, которые предлагает win32std.

к меню ↑

Чтение из реестра

Функция reg_open_key() открывает подключение к реестру и возвращает ресурс. Этот ресурс затем используется с другими функциями реестра действует исходя из этого соединения. Функция reg_close_key() закрывает соединение.

reg_open_key() принимает два аргумента: первый, предопределенная константа представляет один из пяти основных групп в реестре, остаток пути до нужного ключа.

<?php
$keyConst = HKEY_CURRENT_USER;
// backslash is used as an escape so it must be escaped itself
$key = "Software\\Intel";
// open the registry key HKCU\Software\Intel
if (!($reg = @reg_open_key($keyConst, $key))) {
    throw new Exception("Cannot access registry.");
}
…
reg_close_key($reg);?>

Теперь у вас есть открытое соединение, вы можете получить информацию из реестра с помощью функций reg_enum_key()reg_enum_value() и reg_get_value().

Как только ресурс передается reg_enum_key() он будет возвращать массив подразделов в текущем ключе. Целое значение, также может быть переданы для получения подраздела по определенному индексу.

<?php
// retrieve an array of subkeys under the current key
$subkeys = reg_enum_key($reg);
foreach ($subkeys as $index => $subkey) {
    echo "The subkey at " . $index . " is " . $subkey . "\n";
}
// retrieve a specific subkey
$index = 2;
$subkey = reg_enum_key($reg, $index);
echo "The subkey at " . $index . " is " . $subkey . "\n"; ?>

Как reg_enum_key() возвращает ключи, так и reg_enum_value() возвращает значения ключей. Эта функция принимает ресурсы с дополнительным индексом. Название значений могут быть переданы в reg_get_value() для получения значения.

<?php
// retrieve an array of values under a given key
$values = reg_enum_value($reg);
foreach ($values as $index => $value) {
    echo "The value at " . $index . " is " . $value . " and stores ";
    echo reg_get_value($reg, $value) . "\n";
}
// retrieve a specific value given the index
$index = 1;
$value = reg_enum_value($reg, $index);
echo "The value at " . $index . " is " . $value . " and stores ";
echo reg_get_value($reg, $value) . "\n"; ?>
к меню ↑

Запись в реестр

Есть несколько типов данных, которые вы можете выбрать при чтении и записи в реестре. Они обычно малого значения из-за динамичного характера PHP, но когда вы пишете значение, вы должны указать тип. Большую часть времени вы будете использовать REG_SZ или REG_DWORD, но вот список типов данных, предоставляемых расширения:

  • REG_DWORD — значение хранится как 32-разрядные целые
  • REG_SZ — значение хранится в виде строки фиксированной длины
  • REG_EXPAND_SZ — значение хранится в виде переменной длины
  • REG_MULTI_SZ — значение представляет собой список элементов, разделенных разделителем, такие как пробел или запятая
  • REG_BINARY — значение является строкой с двоичными
  • REG_NONE — значения не имеет определенного типа данных, связанных с ним

Функция reg_set_value() используется для записи значений в реестре. Если значение уже существует, оно будет переписано, если не существует, значение будет создано. Функция принимает четыре аргумента: первый открытый ресурс, название значения, предопределенной константы, представляющие данные значения тип и наконец самих данных.

<?php
$keyConst = HKEY_CURRENT_USER;
$key = "Software\\PHPMaster";
if (!($reg = @reg_open_key($keyConst, $key))) {
    throw new Exception("Cannot access registry.");
}
$values = array(
    array("dbDriver", REG_SZ,    "mssql"),
    array("dbHost",   REG_SZ,    "localhost"),
    array("dbPort",   REG_DWORD, 1433),
    array("dbSchema", REG_SZ,    "MyAppDB"),
    array("dbUser",   REG_SZ,    "DBUser"),
    array("dbPass",   REG_SZ,    "s3cr3t"));
foreach ($values as $value) {
    reg_set_value($reg, $value[0], $value[1], $value[2]);
}
reg_close_key($reg); ?>
к меню ↑

Пример — USB Drive Dongle

Вы можете быть удивлены, есть практическое использование для работы с реестром. Можно хранить информацию о конфигурацию веб-приложения в реестре. Если вы написали приложение, то реестр может быть хорошим местом для хранения всех видов информации с данными приложения с предпочтениях пользователя. Windows, сама пишет всякое интересное и состояние соответствующей информации реестра, и некоторые из них могут быть полезны, если вы достаточно творческий.

Допустим наше приложение PHP было лицензировано, и чтобы запустить его к серверу должен быть подключен USB ключ. Как PHP определит наличие ключа? Ответ для Windows лежит в реестре! Каждое устройство имеет уникальный идентификатор, и поэтому сценарий ищет соответствующие ключи для идентификатора.

Первый шаг заключается в определении идентификатора устройства. Для этого примера я буду использовать накопитель. Просто подключите Флешку к порту USB на компьютере, а затем в свойствах Мой компьютер выберите Диспетчер устройств в списке результатов, которые появятся.

Найти устройство в диспетчере устройств, щелкните правой кнопкой мыши на запись, и выберите Свойства из контекстного меню. Затем перейдите на вкладку в окне Сведения и выберите пункт Путь к экземпляру устройства из выпадающего списка. Последовательность шестнадцатеричных чисел к концу значение идентификатор устройства (отмечены красным цветом).

Окно Сведения

Windows, регистрирует наличие устройств USB и различные подразделы HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services. На носителях, таких как флэш-накопитель usbstor, usbaudio, usbccgp, и usbehci. Кроме того отметим, что HKEY_LOCAL_MACHINE будет доступно только привилегированным учетным записям.

Так что теперь мы можем просто искать Enum ключ подраздел для экземпляра устройства. Если привод подключен он будет в списке, а когда он не привязан он не будет в списке.

<?php
// device instance ID
$id = "0060E049DF74EC311000711F";
// WARNING: must run with administrative privs to access these keys
$keyConst = HKEY_LOCAL_MACHINE;
$key = "SYSTEM\\CurrentControlSet\\services\\USBSTOR\\Enum";
if (!($reg = reg_open_key($keyConst, $key))) {
    throw new Exception("Cannot access registry.");
}
$found = false;
$numDevices = reg_get_value($reg, "Count");
for ($i = 0; $i < $numDevices; $i++) {
    $value = reg_get_value($reg, $i);
    if (strpos($val, $id) !== false) {
        $found = true;
        break;
    }
}
reg_close_key($reg);
echo "USB drive dongle ", ($found) ? "found" : "not found";[ ?>

Это простая проверка, также открывает некоторые другие интересные возможности, можно легко закодировать только админ-интерфейс, который проверяет ключ и запрос отправляется с самого сервера, проверяя $ _SERVER ["REMOTE_ADDR"]. Этот комплекс мер, потребует, чтобы пользователь физически на выделенный сервер и обеспечивает форму физического аутентификации.

к меню ↑

В заключение

На протяжении этой статьи вы видели, чем является реестр Windows и небольшой пример того, как в нем может быть найдена информация. Вы можете написать свои данные конфигурации, или вы можете считывать информацию, используя функции, предусмотренные в расширении win32std.

Кстати, расширение win32std предлагает больше чем просто доступ к реестру. Если заинтересовались смотрите что еще он предлагает.

htmlhook.ru | Скрипты для веб-приложений