Реестр Windows является просто иерархически структурированная база данных, в которой операционная система и другие приложения хранят важную информацию о конфигурации.
Все виды данных, хранящихся в реестре: профили пользователей, тип файла ассоциации, информацию об оборудовании, серийные номера, и многое другое. С тех пор как доступна функция расширения win32std, ваши приложения Windows на основе PHP получат доступ к реестру.
Расширение Win32std может быть загружено в качестве предварительно скомпилированных библиотек из downloads.php.net/Pierre/ . Просто поместите его в свою PHP- Ext папку, обновить php.ini файл и перезапустить Apache, если необходимо. Отметим, что библиотеки которые вы загрузите являются 32-разрядными, так что если вы используете 64-разрядную сборку , вам придется, либо установить WampServer 32-разрядную сборку или попытаться скомпилировать библиотеку самостоятельно.
Реестр Layout
Реестр имеет репутацию темные, опасные и страшные места в операционной системе Windows. Это, вероятно, более преувеличенный страх, но все равно я повторю цитату Microsoft:
Перед внесением изменений в реестр, сделайте его резервную копию и убедиться, что вы понимаете, как восстановить его в случае возникновения проблем. Неправильное изменение может привести к серьезным проблемам, которые могут потребовать переустановки операционной системы.
Реестр Windows разделен на 5 основных групп, известных как keys:
- HKEY_CURRENT_CONFIG — ключ хранит информацию о аппаратных средствах компьютера, таких как разрешение монитора и настройки динамиков. Можно увидеть этот ключ сокращенно HKCC.
- HKEY_LOCAL_MACHINE — раздел содержит информацию о конфигурации машины, такие как принтеры, программное обеспечение и информацию сети. Ключ загружается, а затем записи из профиля пользователя переопределяют различные значения. Вы увидите это ключ сокращенно HKLM.
- HKEY_USERS — ключ содержит все профили для локальных учетных записей пользователей на машине. Такие вещи, как заставка пользователя, тема информации и другие настройки. У этого ключа аббревиатура HKU.
- HKEY_CLASSES_ROOT — ключ является псевдонимом, указывающий на HKEY_LOCAL_MACHINE\Software в котором хранится информация о файле ассоциаций и MIME-типы. Аббревиатура HKCR.
- 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 . Заполнить имя и нажмите клавишу ввода.
Теперь у нас есть место для игры, позвольте мне познакомить вас с функциями манипулирования записями реестра, которые предлагает win32std.
Чтение из реестра
Функция reg_open_key() открывает подключение к реестру и возвращает ресурс. Этот ресурс затем используется с другими функциями реестра действует исходя из этого соединения. Функция reg_close_key() закрывает соединение.
reg_open_key() принимает два аргумента: первый, предопределенная константа представляет один из пяти основных групп в реестре, остаток пути до нужного ключа.
Теперь у вас есть открытое соединение, вы можете получить информацию из реестра с помощью функций reg_enum_key() , reg_enum_value() и reg_get_value() .
Как только ресурс передается reg_enum_key() он будет возвращать массив подразделов в текущем ключе. Целое значение, также может быть переданы для получения подраздела по определенному индексу.
$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() для получения значения.
$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() используется для записи значений в реестре. Если значение уже существует, оно будет переписано, если не существует, значение будет создано. Функция принимает четыре аргумента: первый открытый ресурс, название значения, предопределенной константы, представляющие данные значения тип и, наконец, самих данных.
Пример — 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 ключ, подраздел для экземпляра устройства. Если привод подключен он будет в списке, а когда он не привязан он не будет в списке.
Это простая проверка, также открывает некоторые другие интересные возможности, можно легко закодировать только админ-интерфейс, который проверяет ключ и запрос отправляется с самого сервера, проверяя $ _SERVER ["REMOTE_ADDR"] . Этот комплекс мер, потребует, чтобы пользователь физически на выделенный сервер и обеспечивает форму физического аутентификации.
В заключение
На протяжении этой статьи вы видели, чем является реестр Windows и небольшой пример того, как в нем может быть найдена информация. Вы можете написать свои данные конфигурации, или вы можете считывать информацию, используя функции, предусмотренные в расширении win32std.
Утилита REGINI.EXE первоначально входила в состав пакета Resource Kit, но, начиная с Windows XP, является стандартным компонентом системного программного обеспечения. Используется в сценариях администрирования для управления доступом к разделам (ключам) реестра на локальном или удаленном компьютере.
Формат командной строки:
REGINI [-m \\machinename | -h hivefile hiveroot] [-i n] [-o outputWidth][-b] textFiles...
Параметры командной строки:
-m \\machinename - имя или адрес удаленного компьютера, на котором будет выполняться изменение разрешений для разделов реестра.
-h - определяет куст реестра на локальном компьютере, для которого будут устанавливаться разрешения.
-i n – смещение текста от первой позиции строки. По умолчанию равно 4
-o outputWidth - максимальный размер строк вывода. По умолчанию соответствует ширине консоли.
-b - определяет режим обратной совместимости с предыдущими версиями REGINI (backward compatible).
textFiles - имена текстовых файлов в кодировке ANSI или Unicode, представляющих собой сценарии для изменения разрешений реестра.
Примеры использования:
regini /? - отобразить краткую справку по использованию команды.
regini acl1reg.txt - выполнить изменения разрешений для разделов (ключей) реестра на локальном компьютере с использованием файла сценариев acl1reg.txt
regini –m \\COMP0 C:\scripts\acl2reg.txt - выполнить изменения разрешений для реестра на удаленном компьютере COMP0 с использованием сценария C:\scripts\acl2reg.txt
Сценарии для утилиты REGINI содержат специальные директивы и параметры, с помощью которых можно управлять доступом к разделам (ключам) реестра Windows. Файлы сценариев представляют собой обычные текстовые файлы, которые можно редактировать, например, с помощью редактора ”Блокнот” (Notepad). Строки сценариев содержат адреса разделов и числовые коды, разделенные пробелами и определяющие разрешения в формате:
(путь к разделу реестра) [разрешения]
Например, строка сценария, устанавливающая разрешения доступа для раздела Adm :
HKEY_LOCAL_MACHINE\Software\Adm
В данном примере, устанавливаются разрешения , расшифровать которые можно с использованием следующей таблицы:
1 - Администратор, полный доступ
2 - Администратор, чтение
3 - Администратор, чтение и запись
4 - Администратор, чтение, запись и удаление
5 - Создатель, полный доступ
6 - Создатель, чтение и запись
7 - Все, полный доступ
8 - Все, чтение
9 - Все, чтение и запись
10 - Все, чтение, запись и удаление
11 - Опытные пользователи, полный доступ
12 - Опытные пользователи, чтение и запись
13 - Опытные пользователи, чтение, запись и удаление
14 - Системный оператор, полный доступ
15 - Системный оператор, чтение и запись
16 - Системный оператор, чтение, запись и удаление
17 - Система, полный доступ
18 - Система, чтение и запись
19 - Система, чтение
20 - Администратор, чтение, особые разрешения
21 - Интерактивные пользователи, чтение, полный доступ
22 - Интерактивные пользователи, чтение
23 - Интерактивные пользователи, чтение, особые разрешения
0 - Нет групп или пользователей, имеющих разрешение на доступ к данному объекту, но владелец объекта может назначить разрешения.
Таким образом, код означает
Администратор, полный доступ
Создатель, полный доступ
Все, чтение и запись
Необходимо учитывать тот факт, что ранее установленные разрешения сбрасываются, и если, после комбинации в сценарии будет использована, например директива:
HKEY_LOCAL_MACHINE\Software\Adm
То это означает, не добавление кода 4 - Администратор, чтение, запись и удаление, к существующим кодам 1 5 9 , а их замена. Для добавления новых разрешений, с сохранением старых, строка должна быть следующего вида:
HKEY_LOCAL_MACHINE\Software\Adm
При добавлении новых ключей или параметров в реестр, в файле сценария первой строкой указывается имя ключа, а второй (последующими) строкой указывается имя параметра, знак равенства, тип данных и значение:
ИМЯ КЛЮЧА
Имя параметра = тип данных значение
Пример файла сценария:
HKEY_CURRENT_USER\TEST
Text=REG_SZ String1
Первая строка указывает имя ключа (подраздела реестра) HKEY_CURRENT_USER\TEST, в который будет записан параметр и в квадратных скобках – код разрешения доступа к нему. Если подраздел TEST не существует, то он будет создан с указанными разрешениями, если существует – то выполнится смена разрешений на указанные в квадратных скобках. Если код разрешений не задан, то разрешения не изменяются. Вторая строка указывает имя и значение параметра, который будет записан в данный ключ реестра. Если параметр text не существует, то он будет создан, если существует, то будет изменено его значение на строку String1 .
Наличие знака равенства = в строке сценария утилита regini.exe интерпретирует как команду на запись параметра в формате
имя = тип значение
Для удаления значения параметра, строка должна иметь вид:
Для удаления самого параметра, используется ключевое слово DELETE
text=DELETE
Под строкой с именем ключа можно располагать несколько команд на изменение или добавление параметров:
text=REG_SZ This is text
Value1=REG_DWORD 0x0A0D
Использование команды REGINI представляет собой определенную опасность, поэтому, прежде чем делать серьезные изменения в системе, рекомендуется выполнить резервное копирование и ознакомиться со способами восстановления Windows.
Если необходимо установить новые разрешения для куста реестра, принадлежащего другой операционной системе, то необходимо учитывать тот факт, что пути к разделам реестра должны указываться относительно имени куста, так например, для изменения разрешения для раздела HKEY_LOCAL_MACHINE\System на доступ команда должна иметь вид:
regini –h D:\oldwin\system32\config\system newacl.txt
А файл newacl.txt должен содержать строку без имени подраздела:
Для просмотра существующих разрешений в командной строке Windows NT/2000 можно использовать утилиту regdmp.exe из состава дополнительных инструментов Resource Kit. В составе более поздних версий ОС Windows, стандартных средств, для просмотра разрешений разделов реестра в командной строке, не имеется.
Для начала мы усовершенствуем страничку регистрации, добавив возможность загружать аватар. Исходное изображение должно быть формата jpg, gif или png. Так же оно должно быть не более 2 Мб. Не беспокойтесь, после его сжатия скриптом, размер аватара будет около 3 кб и формат jpg. Откройте страницу reg. php и допишите в теге < form > строчку enctype="multipart/form-data" ,как в примере: