Акуратний reg comp php. Команда REGINI – керування доступом до розділів реєстру. Вивільнення буфера шаблону POSIX

Утиліта 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 Цей текст


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",як у прикладі:


Реєстрація










Тепер зберігаємо reg.php

2. Потім необхідно створити ще одне поле в таблиці users. Заходимо в phpmyadmin, Вибираємо потрібну базу та таблицю.


Виставляємо всі значення, як на малюнку:

У це поле записуватиметься шлях до аватара, а він зберігається в окрему папку, назвемо її «avatars». Папка буде розташована в тому ж каталозі, що й інші скриптові файли.

3.Переходимо до файлу save_ user. phpі дописуємо наступний код після видалення прогалин у логіну та паролю:

//видаляємо зайві прогалини
$ login = trim ($ login);

// Дописуємо нове*************************************************

//додаємо перевірку на довжину логіну та пароля
if (strlen($login)< 3 or strlen($login) > 15) {
exit ("Логін повинен складатися не менше ніж із 3 символів і не більше ніж з 15.");
}
if (strlen($password)< 3 or strlen($password) > 15) {
exit ("Пароль повинен складатися не менше ніж із 3 символів і не більше ніж з 15.");
}

if (!empty($_POST["fupload"])) //перевіряємо, чи відправив користувач зображення
{
$fupload=$_POST["fupload"]; $ Fupload = Trim ($ Fupload);
if ($fupload =="" або empty($fupload)) (
unset($fupload);// якщо змінна $fupload порожня, то видаляємо її
}
}
if (!isset($fupload) or empty($fupload) or $fupload =="")
{
//якщо змінної немає (користувач не відправив зображення),то присвоюємо йому заздалегідь приготовлену картинку з написом "немає аватара"
$avatar = "avatars/net-avatara.jpg"; //можете намалювати net-avatara.jpg або взяти у вихідниках
}
else
{
//інакше - завантажуємо зображення користувача
$path_to_90_directory = "avatars/";//папка, куди буде завантажуватися початкова картинка та її стиснута копія

If(preg_match("/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/",$_FILES["fupload"]["name"]))) //Перевірка формату вихідного зображення
{
$filename = $_FILES["fupload"]["name"];
$source = $_FILES["fupload"]["tmp_name"];
$target = $path_to_90_directory. $ filename;
move_uploaded_file($source, $target);//завантаження оригіналу в папку $path_to_90_directory
if(preg_match("/[.](GIF)|(gif)$/", $filename)) (
$im = imagecreatefromgif($path_to_90_directory.$filename) ; //якщо оригінал був у форматі gif, то створюємо зображення у тому форматі. Необхідно для подальшого стиснення
}
if(preg_match("/[.](PNG)|(png)$/", $filename)) (
$im = imagecreatefrompng($path_to_90_directory.$filename) ;//якщо оригінал був у форматі png, то створюємо зображення у цьому ж форматі. Необхідно для подальшого стиснення
}

If(preg_match("/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/", $filename)) (
$im = imagecreatefromjpeg($path_to_90_directory.$filename); //якщо оригінал був у форматі jpg, то створюємо зображення у тому форматі. Необхідно для подальшого стиснення
}
//СТВОРЕННЯ КВАДРАТНОГО ЗОБРАЖЕННЯ І ЙОГО НАСТУПНЕ стиск взято з сайту www.codenet.ru
// Створення квадрата 90x90
// dest - результуюче зображення
// w - ширина зображення
// ratio – коефіцієнт пропорційності
$ w = 90; // Квадратна 90x90. Можна встановити й інший розмір.
// Створюємо вихідне зображення на основі
// вихідного файлу та визначаємо його розміри
$w_src = imagesx($im); //обчислюємо ширину
$ h_src = imagesy ($ im); // обчислюємо висоту зображення
// створюємо порожню квадратну картинку
// важливо саме truecolor!, інакше матимемо 8-бітний результат
$dest = imagecreatetruecolor($w,$w);
// Вирізаємо квадратну серединку по x, якщо фото горизонтальне
if ($w_src>$h_src)
imagecopyresampled($dest, $im, 0, 0,
round((max($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src, $h_src), min($w_src, $h_src));
// Вирізаємо квадратну верхівку по y,
// якщо фото вертикальне (хоча можна також серединку)
if ($w_src<$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
min($w_src, $h_src), min($w_src, $h_src));
// Квадратна картинка масштабується без вирізок
if ($w_src==$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
$date=time(); // обчислюємо час зараз.
imagejpeg($dest, $path_to_90_directory.$date.".jpg");//зберігаємо зображення формату jpg в потрібну папку, ім'ям буде поточний час. Зроблено, щоб аватари не мали однакових імен.
//Чому саме jpg? Він займає дуже мало місця + знищується анімація gif зображення, яке відволікає користувача. Не дуже приємно читати його коментар, коли краєм ока помічаєш якийсь рух.
$avatar = $path_to_90_directory.$date.".jpg";//заносимо в змінну шлях до аватара.
$delfull = $path_to_90_directory.$filename;
unlink ($delfull); // видаляємо оригінал завантаженого зображення, він нам більше не потрібен. Завданням було отримати мініатюру.
}
else
{
//у разі невідповідності формату, видаємо відповідне повідомлення
exit ("Аватар має бути у форматі JPG, GIF або PNG");
}
//кінець процесу завантаження та присвоєння змінної $avatar адреси завантаженої ави
}



// дописали нове********************************************
/ / Далі йде все з першої частини статті, але необхідно дописати зміну в запит до бази.
//Підключаємося до бази
// Перевірка на існування користувача з таким самим логіном
$result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
if (!empty($myrow["id"])) (
exit ("Вибачте, введений вами логін вже зареєстрований. Введіть інший логін.");
}
// якщо такого немає, зберігаємо дані
$result2 = mysql_query ("INSERT INTO users (login,password,avatar) VALUES("$login","$password","$avatar")");
// Перевіряємо, чи є помилки
if ($result2=="TRUE")
{
echo "Ви успішно зареєстровані! Тепер ви можете зайти на сайт. Головна сторінка";
}
else (
echo "Помилка! Ви не зареєстровані.";
}
?>

4. Необхідно додати одну таблицю до тієї ж бази. У ній будуть зберігатися ip-адреси, які припустилися помилки при вході. Таким чином ми зможемо обмежити доступ тим, хто помилився більше трьох разів поспіль на хвилин 15. Думаю програмам, що підбирають паролі, доведеться довго возитися.
Зайдемо в phpmyadmin і створимо нову таблицю з трьома полями:


ip - ip-адреса.
date – дата невдалого входу за останні 15 хвилин у користувача з даними ip. col – кількість помилок за останні 15 хвилин у користувача з даними ip.
Чудово! Готово, тепер змінимо файл перевірки логіну та паролю, адже тепер у нас пароль зашифрований. Відкриваємо testreg.php і видаляємо все, що далі видалення прогалин з логіну та паролю. Далі додаємо наступний код:

//видаляємо зайві прогалини
$ login = trim ($ login);
$ password = trim ($ password);

// замінюємо новим********************************************
// Підключаємося до бази
include ("bd.php");// файл bd.php повинен бути в тій же папці, що й інші, якщо це не так, то просто зміните шлях
// міні-перевірка на підбір паролів
$ip=getenv("HTTP_X_FORWARDED_FOR");
if (empty($ip) || $ip=="unknown") ( $ip=getenv("REMOTE_ADDR"); )
mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900"); // видаляємо ip-адреси помилялися при вході користувачів через 15 хвилин.
$result = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);// вилучаємо з бази кількість невдалих спроб входу за останні 15 у користувача з даним
$myrow = mysql_fetch_array($result);
if ($myrow["col"] > 2) (
/ / Якщо помилок більше двох, тобто три, то видаємо повідомлення.
exit("Ви набрали логін або пароль неправильно 3 рази. Зачекайте 15 хвилин до наступної спроби.");
}
$password = md5($password);//шифруємо пароль
$password = strrev($password); // Для надійності додамо реверс
$password = $password."b3p6f";
//можна додати кілька своїх символів до смаку, наприклад, вписавши "b3p6f". Якщо цей пароль зламуватимуть методом підбору у себе на сервері цієї ж md5, то явно нічого хорошого не вийде. Але раджу ставити інші символи, можна на початку рядка або в середині.
//При цьому необхідно збільшити довжину поля password в базі. Зашифрований пароль може вийти набагато більшого розміру.

$result = mysql_query("SELECT * FROM users WHERE login="$login" AND password="$password"",$db); //витягуємо з бази всі дані про користувача з введеним логіном та паролем
$myrow = mysql_fetch_array($result);
if (empty($myrow["id"]))
{
//якщо користувача з введеним логіном та паролем не існує
//Робимо запис про те, що даний IP не зміг увійти.
$select = mysql_query ("SELECT ip FROM oshibka WHERE ip="$ip"");
$tmp = mysql_fetch_row ($select);
if ($ip == $tmp) (//перевіряємо, чи є користувач у таблиці "oshibka"
$result52 = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"", $db);
$myrow52 = mysql_fetch_array($result52);
$col = $myrow52 + 1;//додаємо ще одну спробу невдалого входу
mysql_query ("UPDATE oshibka SET col=$col,date=NOW() WHERE ip="$ip"");
}
else (
mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ("$ip",NOW(),"1")");
//якщо за останні 15 хвилин помилок не було, то вставляємо новий запис у таблицю "oshibka"
}

exit ("Вибачте, введений вами логін або пароль неправильний.");
}
else (
nbsp; //якщо паролі збігаються, то запускаємо користувачеві сесію! Можете його привітати, він увійшов!
$_SESSION["password"]=$myrow["password"];
$_SESSION["login"]=$myrow["login"];
$_SESSION["id"]=$myrow["id"];//ці дані дуже часто використовуються, ось їх і буде "носити з собою" користувач

//Далі ми запам'ятовуємо дані в куки, для наступного входу.
//УВАГА!!! РОБИТЕ ЦЕ НА ВАШЕ ПЕРЕГЛЯД, ТАК ЯК ДАНІ ЗБЕРІГАЮТЬСЯ У КУКАХ БЕЗ ШИФРОВКИ
if ($_POST["save"] == 1) (
//Якщо користувач хоче, щоб його дані збереглися для наступного входу, зберігаємо в куках його браузера
setcookie("login", $_POST["login"], time()+9999999);
setcookie("password", $_POST["password"], time()+9999999);
}}
echo " ";//перенаправляємо користувача на головну сторінку, там йому і повідомимо про вдалий вхід
?>

5. Цілком змінимо головну сторінку. Необхідно на ній вивести аватар користувача, вивести посилання на вихід з облікового запису та додати чекбокс для запам'ятовування пароля при вході.
Index.php

// Вся процедура працює на сесіях. Саме в ній зберігаються дані користувача, доки він знаходиться на сайті. Дуже важливо запустити їх на самому початку сторінки!
session_start();
include ("bd.php");// файл bd.php повинен бути в тій же папці, що й інші, якщо це не так, то просто зміните шлях
if (!empty($_SESSION["login"]) and !empty($_SESSION["password"]))
{
//якщо існує логін і пароль у сесіях, то перевіряємо їх та витягуємо аватар
$login = $_SESSION["login"];
$password = $_SESSION["password"];
$result = mysql_query("SELECT id,avatar FROM users WHERE login="$login" AND password="$password"",$db);
$myrow = mysql_fetch_array($result);
//витягуємо потрібні дані про користувача
}
?>


Головна сторінка


Головна сторінка

if (!isset($myrow["avatar"]) or $myrow["avatar"]=="") (
//перевіряємо, чи не вилучені дані користувача з бази. Якщо ні, він не увійшов, або пароль в сесії неправильний. Виводимо вікно входу. Але ми не будемо його виводити для тих, хто увійшов, їм воно вже не потрібне.
print<<


HERE;

If (isset($_COOKIE["login"])) //чи є змінна з логіном в COOKIE. Має бути, якщо користувач під час попереднього входу натиснув на чекбокс "Запам'ятати мене"
{
//якщо так, то вставляємо у форму її значення. При цьому користувачеві відображається, що його логін уже вписаний у потрібну графу
echo " value="".$_COOKIE["login"]."">";
}

print<<




HERE;

If (isset($_COOKIE["password"]))//чи є змінна з паролем у COOKIE. Має бути, якщо користувач під час попереднього входу натиснув на чекбокс "Запам'ятати мене"
{
//якщо так, то вставляємо у форму її значення. При цьому користувачеві відображається, що його пароль уже вписаний у потрібну графу
echo " value="".$_COOKIE["password"]."">";
}

Print<<



Запам'ятати мене.






Зареєструватись



Ви увійшли на сайт, як гість

HERE;
}
else
{
//При вдалому вході користувачеві видається все, що розташоване нижче між зірочками.

print<<
Ви зайшли на сайт, як $_SESSION (вихід)


Це посилання доступне лише зареєстрованим користувачам

Ваш аватар:




HERE;

//************************************************************************************
//При вдалому вході користувачеві видається все, що розташоване Вище між зірочками.
}
?>



6. Необхідно зробити можливість вийти з облікового запису користувачам, які увійшли. На головній сторінці вже було посилання на вихід. Але цього файлу поки що не існує. Так створимо новий файл exit.phpз кодом:

session_start();
if (empty($_SESSION["login"]) or empty($_SESSION["password"]))
{
//якщо немає сесії з логіном і паролем, отже цей файл потрапив користувач, що не увійшов. Йому тут не місце. Видаємо повідомлення про помилку, зупиняємо скрипт
exit ("Доступ до цієї сторінки дозволено лише зареєстрованим користувачам. Якщо ви зареєстровані, то увійдіть на сайт під своїм логіном та паролем
Головна сторінка");
}

unset($_SESSION["password"]);
unset($_SESSION["login"]);
unset($_SESSION["id"]); // знищуємо змінні в сесіях
exit(" ");
// Надсилаємо користувача на головну сторінку.
?>

Ну от і все! Використовуйте на здоров'я! Успіхів!

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

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

Розширення Win32std може бути завантажено як попередньо скомпільовані бібліотеки з downloads.php.net/Pierre/ . Просто помістіть його в свою PHP-Ext папку, оновити php.ini файл і перезапустити Apache, якщо потрібно. Зазначимо, що бібліотеки, які ви завантажите, є 32-розрядними, так що якщо ви використовуєте 64-розрядну збірку, вам доведеться або встановити 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. Заповніть ім'я та натисніть клавішу введення.

Тепер ми маємо місце для гри, дозвольте мені познайомити вас з функціями маніпулювання записами реєстру, які пропонує 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.

#include
#include
int regcomp(regex_t *preg, const char *regex, intcflags);
int regexec(const regex_t *preg, const char *string, size_tnmatch,
regmatch_tpmatch, inteflags);
size_t regerror(interrcode, const regex_t *preg, char *errbuf,
size_terrbuf_size);
void regfree (regex_t *preg);

ОПИС

Компілювання регулярних виразів POSIX

Функція regcomp() використовується для компіляції регулярного вираження у формат, який підходить для подальших пошуків за допомогою regexec().

regcomp() передається вказівник на область зберігання буферного шаблону preg, покажчик на рядок, що закінчується regexта прапори cflags, що використовуються для визначення типу компіляції

Всі пошуки регулярних виразів повинні виконуватися за допомогою скомпілюваного буферного шаблону, тому regexec() повинна завжди викликатися з адресою буферного шаблону, ініціалізованого функцією regcomp().

Значення cflagsможе складатися з порозрядного orнуля або кількох наступних значень:

REG_EXTENDEDВикористовувати синтаксис розширених регулярних виразів POSIX під час інтерпретації regex. Якщо не ввімкнено цей прапор, то використовується синтаксис простих регулярних виразів POSIX. REG_ICASEНе враховувати регістр. Наступні пошуки regexec() з використанням цього буферного шаблону не залежатимуть від регістру. REG_NOSUBНе повідомляти про положення збігів. Параметри nmatchі pmatchдля regexec() ігноруються, якщо цей буферний шаблон був скомпільований з цим увімкненим прапором. REG_NEWLINEОператори збігу з будь-яким символом не збігаються із символом нового рядка.

Список символів, що не збігаються ( [^...] ) без символу нового рядка не збігається з новим рядком.

Оператор порівняння на початку рядка ( ^ ) збігається з порожнім рядком відразу після нового рядка незалежно від того, що eflags, прапори виконання regexec(), містять REG_NOTBOL.

Оператор порівняння до кінця рядка ($) збігається з порожнім рядком до символу початку рядка незалежно від того, що eflagsмістить REG_NOTEOL.

Порівняння з регулярним виразом POSIX

Функція regexec() використовується для порівняння рядка, що завершується null, з попередньо обробленим буферним шаблоном preg. Аргументи nmatchі pmatchвикористовуються для надання інформації про місцезнаходження будь-яких збігів. Значення eflagsможе бути розрядним АБОодного або обох значень REG_NOTBOLі REG_NOTEOL. Дані значення визначають поведінку порівняння так, як описано нижче. REG_NOTBOLОператор порівняння на початку рядка завжди завершується з помилкою (але дивіться описаний вище прапор компіляції REG_NEWLINE). Цей прапор може використовуватися, коли в regexec() передаються окремі частини рядка, і початок такого рядка в даному випадку не повинен інтерпретуватися як початок нового рядка. REG_NOTEOLОператор порівняння до кінця рядка завжди завершується з помилкою (але дивіться описаний вище прапор компіляції REG_NEWLINE).

Байтові усунення

Якщо REG_NOSUBне встановлений при компіляції буферного шаблону, можливо отримувати інформацію про положення збігів. Значення pmatchмає бути визначено так, щоб мати, принаймні, nmatchелементів. Вони заповнюються regexec() адресами внутрішньорядкових збігів. Зміщення підвираження, що починається з i-ї відкритої дужки, зберігається в pmatch[i]. Адреса збігу всього регулярного виразу зберігається в pmatch(зауважимо, що щоб повернути усунення збігів Nподвиражений, значення nmatchмає бути не менше N+1). Будь-які невикористані елементи структури матимуть значення -1.

Структура regmatch_t, що є типом pmatch, визначена в :

Typedef struct ( regoff_t rm_so; regoff_t rm_eo; ) regmatch_t;

Кожен елемент rm_so, Не рівний -1, показує початкове зсув наступного збігу найбільшої підрядки всередині заданого рядка. Відносний елемент rm_eoвказує на зсув кінця збігу, який є першим символом після тексту, що збігся.

Повідомлення про помилки POSIX

Функція regerrorвикористовується для перетворення кодів помилок, які можуть бути отримані від regcomp() та regexec(), у рядки повідомлень про помилки.

У regerrorпередаються: код помилки errcode, буферний шаблон pregвказівник на символьний буфер рядка errbufта розмір буфера рядка errbuf_size. Функція повертає розмір errbuf, який потрібно зберегти повідомлення про помилку у вигляді рядка, що закінчується null. Якщо і errbuf, і errbuf_sizeне дорівнюють нулю, то errbufзаповнюється першими errbuf_size - 1символами повідомлення про помилку та завершується байтом null ("\0").

Вивільнення буфера шаблону POSIX

Функція regfree() звільняє пам'ять, відведену буферному шаблону pregпід час процесу компіляції за допомогою regcomp().

ПОВЕРНЕНИЙ ЗНАЧЕННЯ

Функція regcomp() повертає нуль при успішній компіляції або в іншому випадку код помилки.

Функція regexec() повертає нуль при збігу або REG_NOMATCHякщо збігів не було.

ПОМИЛКИ

Функція regcomp() може повертати такі помилки: REG_BADBRНеправильне використання оператора зворотних посилань. REG_BADPATНеправильне використання операторів шаблону, наприклад операторів групи або списку. REG_BADRPTНеправильне використання операторів повторення, наприклад, використання «*» як перший символ. REG_EBRACEНепарні дужки в операторах інтервалу. REG_EBRACKНепарні квадратні дужки операторів списку. REG_ECOLLATEНеправильний елемент сортування. REG_ECTYPEНевідоме ім'я класу символи. REG_EENDПотенційна помилка. Не визначено у POSIX.2. REG_EESCAPEКінцева зворотна коса характеристика. REG_EPARENНепарні круглі дужки в операторах угруповання. REG_ERANGEНеправильне використання оператора області: наприклад, кінець області з'являється раніше її початку. REG_ESIZEСкомпільований регулярний вираз вимагає буферний шаблон розміром 64 Кб. Це не визначено у POSIX.2. REG_ESPACEДля процедур регулярних виразів закінчилась пам'ять. REG_ESUBREGНеправильне зворотне посилання на вираз.