Чтение строки из реестра c. Скрываем логические диски

Реестр Windows является неотъемлемой частью каждой операционной системы Microsoft Windows. Он действует так, же как каталог, в котором хранятся все виды пользовательских настроек, конфигурационных данных о приложениях, файловые ассоциации и т.д. Если попробовать дать определение этого чудо-компонента, то реестр - компонент операционной системы компьютера, который в иерархической базе данных хранит важнейшие установки и информацию о приложениях, системных операциях и пользовательской конфигурации. Таким образом, возможность работы с реестром – это что-то, что не может быть упущено из виду разработчиком Windows приложений.

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

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

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

Структура реестра

Важно понять структуру реестра на данном этапе усваивания материала, что бы потом у нас не возникло непонимания по ходу дальнейшего изучения. В этом разделе мы очень быстро и кратко «пробежимся» по реестру, т.к. на подробное его изучение потребуется много времени и места. Представьте реестр как папку. В ней могут быть другие папки и файлы. Теперь разберемся с обозначением. Реестр Windows содержит два элемента: раздел (key) и значение (value). В нашей аналогии разделы выступают в роли папок, в то время как значения – файлы. В действительности, значения – это пары «имя-данные». Это значит, что значение делится на две части: имя и данные. Имя используется как идентификатор, а данные как часть фактических данных. Каждый раздел имеет значение, но, помимо значения, раздел может иметь и подраздел. Весь реестр делится на логические разделы, которые называются «ульи» (hives). Всего таких разделов пять.

Теперь зайдите в редактор реестра (Пуск-Выполнить-regedit) и посмотрите его структуру. На всякий случай сделайте копию реестра. Хотя наша программа будет безобидной для него, лишним это действие все равно не будет. Для тех, кто не знает, я расскажу, как сделать копию реестра.

Что бы сделать backup своего реестра выполните следующие действия:
1) Нажмите "Пуск", "Выполнить" и введите "regedit".
2) Появится окно редактора реестра. Нажмите в верхней части окна "Файл", потом "Экспорт". Введите любое имя для сохраняемого резервного файла реестра, тип файла выберите "Файлы реестра *.reg". Ниже, под надписью "Диапазон экспорта" выберите "Весь реестр", нажмите "Сохранить".

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

Базовые функции реестра

В этой статье мы узнаем, как читать, изменять и записывать данные в реестр. По ходу этого раздела мы рассмотрим некоторые из основных функций для открытия подразделов реестра и работы с ними. Функции, с которыми мы будем работать, Вы сможете найти в файле windows.h. Эти функции работают с любой версией Windows.

Наша первая функция - RegOpenKeyEx (). Эта функция открывает указанный раздел реестра и возвращает ERROR_SUCCESS при успешном выполнении. Важно понять, что эта функция открывает уже существующий раздел; она не создаст новый раздел, если такового не существует.

Вторая функция, которую мы будем использовать – это функция RegSetValueEx(), которая создает новое значение в нашем разделе, открытом с помощью первой рассмотренной функции.

Следующие три функции позволят добавить новый раздел и удалить данные с реестра. RegCreateKeyEx () будет использоваться для создания нового ключа, а при удалении значения и ключа мы будем вызывать RegDeleteValue () и RegDeleteKey () соответственно. Если Вы пользователь Windows Vista или Microsoft Server 2008, то вместо функции RegDeleteValue () Вам следует вызвать функцию RegDeleteTree(). Хотя чаще возникает потребность писать универсальное приложение, которое будет работать с любым продуктом Microsoft. Поэтому делайте проверку WINWER в своем коде.

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

Как понятно из названия данного раздела, тут будет код нашей программы. Но перед тем, как писать код необходимо создать пустое консольное приложение. Я использую Microsoft Visual Studio 2010. О том, как создать, необходимый нам, тип приложения подробно описано в последнем номере журнала () в статье "Что нам стоит GUI построить".

Тут я приведу сразу весь код, а потом прокомментирую его, дав подробное описание каждой функции.
int main()
{
HKEY hKey;
DWORD dwDisposition;
unsigned char szStr;
szStr="1"; szStr="\0";

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\VR_Online\\Test"), 0, KEY_ALL_ACCESS, &hKey)!=ERROR_SUCCESS)
cout<<"\nError opening the desired subkey (doesn"t exist?).\n";
else
{

cout<<"\nThe value of the key was set successfully.\n";
else
cout<<"\nError setting the value of the key.\n";
}
RegCloseKey(hKey);

RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\VR_Online\\Test\\Another SubKey"), 0, NULL, 0, 0, NULL, &hKey, &dwDisposition);
if (dwDisposition != REG_CREATED_NEW_KEY && dwDisposition != REG_OPENED_EXISTING_KEY)
cout<<"\nError creating the desired subkey (permissions?).\n";
else
cout<<"\nThe subkey was successfully created.\n";
RegCloseKey(hKey);


{

cout<<"\nString Value value successfully removed.\n";
else
cout<<"\nError removing the specified value (permissions?).\n";
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey(hKey);

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\VR_Online\\Test"), 0, KEY_ALL_ACCESS, &hKey)==ERROR_SUCCESS)
{

cout<<"\nAnother SubKey key successfully removed.\n";
else
cout<<"\nError removing the specified key (permissions?).\n";
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey(hKey);


{

cout<<"\nTest key successfully removed.\n";
else
cout<<"\nError removing the specified key (permissions?).\n";
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey(hKey);


{

cout<<"\nVR_Online key successfully removed.\n";
else
cout<<"\nError removing the specified key (permissions?).\n";
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey(hKey);

Ну, что же, теперь надо разобраться, что тут написано.
HKEY hKey;
DWORD dwDisposition;
unsigned char szStr;
szStr="1"; szStr="\0";

В первой строке мы объявили переменную hKey, типа HKEY. Это переменная – дескриптор указанного «улья» реестра. Во второй строке объявлена переменная, dwDisposition, которая нужна для определения, является ли подраздел созданным или он уже существовал, и может ли он быть открыт успешно. Данная переменная понадобится нам для функции RegCreateKeyEx (). Подробно о значениях, которые функция загоняет в эту переменную, Вы сможете узнать на msdn.com в описании данной функции. Далее мы объявили массив типа unsigned char, состоящий из двух элементов. Первому элементу мы присвоили значение «1», а второму – конец строки. Эта переменная (массив) будет служить данными для нашего имени при создании нового значения функцией RegSetValueEx().
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\VR_Online\\Test"), 0, KEY_ALL_ACCESS, &hKey)!=ERROR_SUCCESS)
cout<<"\nError opening the desired subkey (doesn"t exist?).\n";
else
{
if (RegSetValueEx(hKey, TEXT("String Value"), NULL, REG_SZ, szStr, sizeof(szStr))==ERROR_SUCCESS)
cout<<"\nThe value of the key was set successfully.\n";
else
cout<<"\nError setting the value of the key.\n";
}
RegCloseKey(hKey);

В вышеприведенном куске кода мы проверяем успешное выполнение функции RegOpenKeyEx(). Описание этой функции приведено выше. Т.к. эта функция открывает уже существующий раздел то, выполнение этой функции выдаст нам сообщение об ошибке. Что бы этого избежать, можно создать «вручную» этот раздел, а можно и программно. Давайте создадим его «вручную», т.к. далее вы узнаете, как создавать разделы программно. Что бы «вручную» создать раздел, необходимо войти в редактор реестра (Пуск-Выполнить-regedit), выбрать нужным нам «улей» (в нашем случае HKEY_LOCAL_MACHINE). В нем выбираем раздел «SOFTWARE» (кстати, в нашей функции, как и во всех функциях работы с реестром регистр букв не важен), жмем на него правой клавишей мыши и «Создать»-«Раздел». Присваиваем разделу имя VR_Online, а потом в нем создаем подраздел с именем «Test» аналогичным образом.

Первый параметр функции – раздел реестра, который мы хотим открыть. Второй – имя подраздела. В данном примере мы открыли подраздел “SOFTWARE” По поводу третьего параметра документация Microsoft говорит только то, что он зарезервирован и должен быть равным нулю. Четвертый параметр – уровень доступа. В данном примере мы получили полный доступ к этому разделу. Однако не всегда раздел позволят получить к нему полный доступ, в таком случае функция будет выполнена неудачно. Последний параметр этой функции – указатель на переменную, которой будет передан дескриптор открытого раздела.

Если раздел существует, то мы устанавливаем ему значение (помните я говорил, что значение есть пара «имя-данные»?). Именем значения будет «String Value», а данными – наш массив szStr. Создаем мы значение с помощью функции RegSetValueEx(),в которую последовательно передаем дескриптор раздела, название переменной, тип данных (с типами данных Вы можете ознакомиться на msdn - http://msdn.microsoft.com/en-us/library/ms724884 (v=vs.85).aspx), сейчас только скажу, что этот тип значит строковую переменную. Последние два параметра – указатель на буфер данных и его размер. О результате выполнения этой функции на экран выводится сообщение. В конце мы вызываем функцию RegCloseKey().

Далее мы программно создадим подраздел. Делается это с помощью функции RegCreateKeyEx ().
RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\VR_Online\\Test\\Another SubKey"), 0, NULL, 0, 0, NULL, &hKey, &dwDisposition);

if (dwDisposition != REG_CREATED_NEW_KEY && dwDisposition != REG_OPENED_EXISTING_KEY)
cout<<"\nError creating the desired subkey (permissions?).\n";
else
cout<<"\nThe subkey was successfully created.\n";
RegCloseKey(hKey);

Первые два параметра, а так же предпоследний параметр, понятны исходя из уже известного материала. Про последний параметр я рассказал выше, при описании, объявленных в начале функции main(), переменных. Третий параметр зарезервирован и должен равняться нулю. Четвертый – тип класса раздела. В пятом параметре могут содержаться дополнительные опции, значение которых можно глянуть в описании этой функции на msdn. Следующий параметр определяет спецификатор доступа к данному разделу. Седьмой параметр является атрибутом безопасности. Он определяет, может ли данный раздел (а точнее его дескриптор) наследоваться дочерными процессами. Если он в значении NULL, то дескриптор не может быть унаследован.

А теперь очистим наш реестр от всего того, что мы создали.
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\VR_Online\\Test"), 0, KEY_ALL_ACCESS, &hKey)==ERROR_SUCCESS)
{
if (RegDeleteValue(hKey, TEXT("String Value"))==ERROR_SUCCESS)
cout<<"\nString Value value successfully removed.\n";
else
cout<<"\nError removing the specified value (permissions?).\n";
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey(hKey);

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\VR_Online\\Test"), 0, KEY_ALL_ACCESS, &hKey)==ERROR_SUCCESS)
{
if (RegDeleteKey(hKey, TEXT("Another SubKey"))==ERROR_SUCCESS)
cout<<"\nAnother SubKey key successfully removed.\n";
else
cout<<"\nError removing the specified key (permissions?).\n";
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey(hKey);

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\VR_Online"), 0, KEY_ALL_ACCESS, &hKey)==ERROR_SUCCESS)
{
if (RegDeleteKey(hKey, TEXT("Test"))==ERROR_SUCCESS)
cout<<"\nTest key successfully removed.\n";
else
cout<<"\nError removing the specified key (permissions?).\n";
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey(hKey);

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software"), 0, KEY_ALL_ACCESS, &hKey)==ERROR_SUCCESS)
{
if (RegDeleteKey(hKey, TEXT("VR_Online"))==ERROR_SUCCESS)
cout<<"\nVR_Online key successfully removed.\n";
else
cout<<"\nError removing the specified key (permissions?).\n";
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey(hKey);

Что ж…тут только две новых функции: RegDeleteValue() и RegDeleteKey(). Их назначение понятно из их названий, а параметры понятны из усвоенного материала и простой интуиции. Как Вы могли заметить, эта часть кода обладает значительным минусом – нельзя удалить сразу раздел VR_Online со всем его содержимым. Удалять надо, начиная с «глубин» подраздела. Но заинтересовавшиеся читатели могут попробовать написать рекурсивную функцию, которая сама будет это делать.

Я вот еще раз перечитал свою статью и понял, что чего-то тут не хватает. Дело в том, что чаще приходится использовать данные реестра, а не изменять их или добавлять данные в реестр. Поэтому, как бонус, тем, кто дочитал до этого места, я рассажу, как с помощью реестра получить адрес стартовой страницы Internet Explorer, а затем изменить его. И хотя этим браузером мало кто пользуется, технология получения подобной информации одинакова. Для начала установим значение стартовой страницы. Сделать это можно тремя способами: через редактор реестра вручную, через браузер и программно. Т.к. наша тема связана с реестром, а программно мы изменим значение позже, то сейчас мы это сделаем вручную.

Заходим в «Пуск» - «Выполнить» и пишем regedit. В редакторе реестра проходи по пути «Software\\Microsoft\\Internet Explorer\\Main» и находим там значение Start Page. Жмем на эту переменную два раза и в появившемся диалоговом окне в поле «значение» указываем, например, «http://google.com”.

Следующий код Вы можете использовать как раз для достижения нашей «бонусной» цели.
TCHAR lpData={0};
DWORD buffersize = sizeof(lpData);

If (RegOpenKeyEx (HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Internet Explorer\\Main"),NULL,KEY_READ,&hKey)==ERROR_SUCCESS)
{
if (RegQueryValueEx(hKey,TEXT("Start Page"),NULL,NULL,(LPBYTE) lpData,&buffersize)==ERROR_SUCCESS)
{
cout<<"\nYour current Internet start page is ";
wcout< }
else
cout<<"\nError getting the specified value.\n"
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey (hKey);

TCHAR *Val=_T("http://сайт");
DWORD size=_tcslen(Val);

if (RegOpenKeyEx (HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Internet Explorer\\Main"),NULL,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)
{
if (RegSetValueEx(hKey, TEXT("Start Page"),0, REG_SZ, (BYTE*)Val,2*size)==ERROR_SUCCESS)
{
cout<<"\nNow your Internet start page is ";
wcout< }
else
cout<<"\nError setting the value of the key.\n";
}
else
cout<<"\nError opening the specified subkey path (doesn"t exist?).\n";

RegCloseKey (hKey);

Как видно из кода, у нас только одна неизвестная нам функция. RegQueryValueEx(). Она позволяет получить значение, которое хранится в указанном разделе. Первые два параметра этой функции, я думаю, не стоит описывать. Третий зарезервирован. Четвертый параметр содержит тип получаемого значения. Два последних параметра определяют буфер, в который будет записано значение, и его размер соответственно. Ну а далее мы изменяем значение этой переменной с помощью,уже известной нам, функции.

Что бы Вам было более ясно происходящее в данном коде, я расскажу Вам о типах char, TCHAR и о кодировке UNICODE.

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

Тип char используется для ANSI строк, т.е. строк, символы которых занимают один байт (8 бит). То есть допускается всего 256 (2 в восьмой степени) символов. Гляньте в таблицу ASCII, и Вы увидите, что все символы там не выходят за значение 255. Этого количества символов хватает нам с Вами с нашим-то алфавитом. И тип char идеально подходит для содержания этих символов.

Но давайте подумаем о японцах. У них существуют различные наборы символов, такие как, например катакана (katakana), хирагана (hiragana), канжи (kanji) и ромаджи (romaji). Невозможно впихнуть все эти символы в диапазоне от нуля до 255. Поэтому и используется кодировка Unicode, которая может содержать 65535 (2 в шестнадцатой степени) символов.

В основном тип TCHAR и используется для описания Unicode строк. В отличие от типа char, tchar занимает 2 байта. Это и объясняет умножение на двойку длины строки, в которой содержится новое имя стартовой страницы.
if (RegSetValueEx(hKey, TEXT("Start Page"),0, REG_SZ, (BYTE*)Val,2*size)==ERROR_SUCCESS)

Т.к. продукты Microsoft используют по всему миру, то программисты этой компании потрудились над тем, что бы разработчикам приложений под их основной продукт было удобно пользоваться своим языком, а не вездесущим английским. Поэтому почти все API функции «зависят» от Unicode.
Для удобной работы с Unicode – строками существует файл tchar.h. В нем собрано огромное количество макросов для работы TCHAR. Макрос TEXT, взятый как раз из этой библиотеки, позволяет компилировать программу и под Unicode и под ANSI. Так же там описан оператор wcout, который работает аналогично cout, но для TCHAR-типа.
Я думаю, что материал этого раздела хоть как-то пролил свет на Ваше представление о происходящем.

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

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

Если по каким-то причинам, у Вас не работает код, который я приводил в пример, ниже Вы можете скачать рабочий.cpp файл этой программы.

Спасибо за внимание.

Written by: Сергей Дубовик aka SD
E-mail: eval(unescape("%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%73%64%62%6f%78%40%74%75%74%2e%62%79%22%3e%73%64%62%6f%78%40%74%75%74%2e%62%79%3c%2f%61%3e%27%29%3b"))

    Реестр (системный реестр) - это иерархическая база данных, содержащая записи, определяющие параметры и настройки операционных систем Microsoft Windows. Реестр в том виде, как он выглядит при просмотре редактором реестра, формируется из данных, источниками которых являются файлы реестра и информация об оборудовании, собранная в процессе загрузки. В описании файлов реестра на английском языке используется термин "Hive". В некоторых работах его переводят на русский как "Улей". Microsoft в своих документах переводит это как "Куст". Файлы реестра создаются в процессе установки операционной системы и хранятся в папке %SystemRoot%\system32\config (обычно C:\windows\system32\config). Для операционных систем Windows 2000/XP это файлы с именами
default
sam
security
software
system
.В процессе загрузки система получает монопольный доступ к данным файлам и, поэтому, стандартными средствами работы с файлами вы ничего с ними сделать не сможете (открыть для просмотра, скопировать, удалить, переименовать). Для работы с содержимым системного реестра используется специальное программное обеспечение - редакторы реестра (REGEDIT.EXE, REGEDT32.EXE), являющиеся стандартными компонентами операционной системы. Для запуска реестра используется "Пуск" "Выполнить" - regedit.exe

    В левой половине окна вы видите список корневых разделов (root keys) реестра. Каждый корневой раздел может включать в себя вложенные разделы (subkeys) и параметры (value entries).
Коротко о назначении корневых разделов:
HKEY_CLASSES_ROOT (сокращенное обозначение HKCR ) - Ассоциации между приложениями и расширениями файлов и информацию о зарегистрированных объектах COM и ActiveX.
HKEY_CURRENT_USER (HKCU) - Настройки для текущего пользователя (рабочий стол, настройки сети, приложения). Этот раздел представляет собой ссылку на раздел HKEY_USERS\Идентификатор пользователя (SID) в виде S-1-5-21-854245398-1035525444-...
SID - уникальный номер, идентифицирующий учетную запись пользователя, группы или компьютера. Он присваивается учетной записи при ее создании. Внутренние процессы Windows обращаются к учетным записям по их кодам безопасности, а не по именам пользователей или групп. Если удалить, а затем снова создать учетную запись с тем же именем пользователя, то предоставленные прежней учетной записи права и разрешения не сохранятся для новой учетной записи, так как их коды безопасности будут разными. Аббревиатура SID образована от Security ID. Для просмотра соответствия SID и имени пользователя можно воспользоваться утилитой PsGetSID.exe из пакета
HKEY_LOCAL_MACHINE (HKLM) - Глобальные аппаратные и программные настройки системы. Применимы ко всем пользователям. Это самая большая и самая важная часть реестра. Здесь сосредоточены основные параметры системы, оборудования, программного обеспечения.
HKEY_USERS(HKU) - индивидуальные настройки среды для каждого пользователя системы (пользовательские профили) и профиль по умолчанию для вновь создаваемых пользователей.
HKEY_CURRENT_CONFIG (HKCC) - конфигурация для текущего аппаратного профиля. Обычно профиль один единственный, но имеется возможность создания нескольких с использованием "Панель управления" - "Система" - "Оборудование"- "Профили оборудования". На самом деле HKCC не является полноценным разделом реестра, а всего лишь ссылкой на раздел из HKLM
HKLM\System\ CurrentControlSet\CurrentControlSet\Hardware Profiles\Current

    Возможности конкретного пользователя при редактировании данных реестра определяются его правами в системе. Далее по тексту, предполагается, если это не оговорено особо, что пользователь имеет права администратора системы.
    Вообще-то, в корневом разделе HKLM есть еще 2 подраздела с именами SAM и SECURITY, но доступ к ним разрешен только под локальной системной учетной записью (Local System Account), под которой обычно выполняются системные службы (system services). Т.е для доступа к ним нужно, чтобы редактор реестра был запущен с правами Local System, для чего можно воспользоваться
psexec.exe -i -s regedit.exe
Подробное описание утилиты - на странице "Утилиты PSTools"

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


Сохранение и восстановление реестра

1. Использование точек восстановления (Restore Points)

    В Windows XP , существует механизм,с помощью которого, при возникновении проблем, можно восстановить предыдущее состояние компьютера без потери личных файлов (документы Microsoft Word, перечень просмотренных страниц, рисунки, избранные файлы и сообщения электронной почты). Точки восстановления (Restore Points) создаются системой автоматически во время простоя компьютера, а также во время существенных системных событий (таких, как установка приложения или драйвера). Пользователь также имеет возможность в любое время создавать их принудительно. Эти точки восстановления позволяют вернуть систему к состоянию на момент их создания.
    Для работы с точками восстановления используется приложение \windows\system32\restore\rstrui.exe (Пуск - Программы - Стандартные - Служебные - Восстановление системы ).

    Данные контрольных точек восстановления хранятся в каталоге System Volume Information системного диска. Это скрытый системный каталог, доступ к которому разрешен только локальной системной учетной записи (Local System, т.е. "Службе восстановления системы"). Поэтому, если вы хотите получить доступ к его содержимому, вам придется добавить права вашей учетной записи с использованием вкладки "Безопасность" в свойствах каталога "System Volume Information". В папке System Volume Information есть подкаталог с именем, начинающемся с _restore... и внутри него - подкаталоги RP0, RP1... : - это и есть данные контрольных точек восстановления (Restore Point - RPx). Внутри папки RPx имеется каталог snapshot , содержащий копии файлов реестра на момент создания контрольной точки. При выполнении операции восстановления системы восстанавливаются основные системные файлы и файлы реестра. Механизм довольно эффективный, но воспользоваться им можно только в среде самой Windows. Если же система повреждена настолько, что загрузка невозможна, выход из ситуации все равно есть. Как - читайте в статье "Проблемы с загрузкой ОС" раздел

2. Использование утилиты резервного копирования/восстановления NTBACKUP.EXE

    В Windows 2000 механизма точек восстановления нет. Однако, как и в Windows XP, имеется утилита архивации, а точнее - резервного копирования и восстановления NTBACKUP.EXE , позволяющая выполнить практически то же, что делается при создании точек восстановления (и даже намного больше). NTBACKUP позволяет создать архив состояния системы из 2-х частей, - загрузочной дискеты, позволяющей выполнить восстановление даже на незагружающейся системе и собственно архив данных для восстановления (в виде обычного файла с расширением.bkf, сохраняемого на жестком диске или съемном носителе). Для получения копии состояния системы жмем "Пуск" - "Выполнить"- ntbackup.exe

Запускаем , и указываем ему, что нужно архивировать состояние системы.

И где хранить данные архива

    После завершения работы мастера будет создан архив состояния системы (D:\ntbackup.bkf) С помощью "Мастера восстановления" вы можете всегда вернуть состояние системы на момент создания архива.

3. Использование утилиты для работы с реестром из командной строки REG.EXE

    В Windows 2000 утилита REG.EXE входит в состав пакета Support tools (можно также использовать REG.EXE из комплекта Windows XP - просто скопируйте ее в каталог \winnt\system32). Запускается из командной строки. При запуске без параметров выдает краткую справку по использованию:

Программа редактирования системного реестра из командной строки, версия 3.0
(C) Корпорация Майкрософт, 1981-2001. Все права защищены

REG Операция [Список параметров]

Операция == [ QUERY | ADD | DELETE | COPY |
SAVE | LOAD | UNLOAD | RESTORE |
COMPARE | EXPORT | IMPORT ]

Код возврата: (за исключением REG COMPARE)
0 - Успешно
1 - С ошибкой

Для получения справки по определенной операции введите:
REG Operation /?

Примеры:

REG QUERY /?
REG ADD /?
REG DELETE /?
REG COPY /?
REG SAVE /?
REG RESTORE /?
REG LOAD /?
REG UNLOAD /?
REG COMPARE /?
REG EXPORT /?
REG IMPORT /?

Для резервного копирования реестра используется REG.EXE SAVE, для восстановления - REG.EXE RESTORE

Для получения справки

REG.EXE SAVE /?
REG SAVE раздел имя Файла

Раздел - Полный путь к разделу реестра в виде: КОРЕНЬ\Подраздел
КОРЕНЬ - Корневой раздел. Значения: [ HKLM | HKCU | HKCR | HKU | HKCC ].
подраздел - Полный путь к разделу реестра в выбранном корневом разделе.
имя Файла - Имя сохраняемого файла на диске. Если путь не указан, файл
создается вызывающим процессом в текущей папке.

Примеры:
REG SAVE HKLM\Software\MyCo\MyApp AppBkUp.hiv
Сохраняет раздел MyApp в файле AppBkUp.hiv в текущей папке

    Синтаксис REG SAVE и REG RESTORE одинаков и вполне понятен из справки. Есть, правда некоторые моменты. В версии утилиты из ОС Windows 2000 нельзя было указывать путь в имени файла для сохранения раздела реестра и сохранение выполнялось только в текущий каталог. Справка самой утилиты и примеры ее использования для сохранения (REG SAVE) вполне можно использовать для сохранения любых разделов реестра, в т.ч. HKLM\software, HKLM\system и т.п. однако, если вы попробуете восстановить, например, HKLM\system, то получите сообщение об ошибке доступа, вызванную занятостью данного раздела реестра, а поскольку он занят всегда, восстановление с помощью REG RESTORE выполнить не удастся.

Для сохранения куста SYSTEM:
REG SAVE HKLM\SYSTEM system.hiv
Для сохранения куста SOFTWARE:
REG SAVE HKLM\SOFTWARE software.hiv
Для сохранения куста DEFAULT:
reg save HKU\.Default default.hiv

Если файл существует, то REG.EXE выдаст ошибку и завершится.

    Сохраненные файлы можно использовать для восстановления реестра ручным копированием в папку %SystemRoot%\system32\config.

4. Ручное копирование файлов реестра.

    Если загрузиться в другой операционной системе, то с файлами из папки реестра можно делать все, что угодно. В случае повреждения файла system, можно воспользоваться, например, сохраненным с помощью REG SAVE файлом system.hiv, скопировав его в папку реестра и переименовав в system. Или выполнить это же действие, используя сохраненную копию файла system из контрольной точки восстановления. Довольно подробно данный метод восстановления реестра описан в статье "Проблемы с загрузкой ОС"

5. Использование режима экспорта-импорта реестра.

Редактор реестра позволяет делать экспорт как всего реестра, так и отдельных разделов в файл с расширением reg Импорт полученного при экспорте reg-файла позволяет восстановить реестр. Щелкаете на "Реестр"--> "Экспорт (Импорт) файла реестра". Импорт также можно выполнить двойным щелчком по ярлыку reg-файла.

6. Использование специальных утилит для работы с реестром сторонних производителей.

    Существует немало программ сторонних производителей для работы с реестром, позволяющих не только сохранять и восстанавливать данные реестра, но и выполнять массу других полезных операций, таких, как диагностика и удаление ошибочных или ненужных данных, оптимизация, дефрагментация и т.п. Большинство из них платные - jv16 Power Tools, Registry Mechanic, Super Utilities Pro, Reg Organizer и другие. Список и краткое описание на secutiylab.ru
К основным преимуществам данных программ можно отнести, как правило, простой интерфейс пользователя, возможность выполнить тонкую настройку операционной системы и предпочтений пользователя, чистку от ненужных записей, расширенные возможности по поиску и замене данных, резервное копирование и восстановление.
    Пожалуй, самым популярным программным обеспечением для работы с реестром является jv16 Power Tools компании Macecraft Software . Главные достоинства - высокая надежность, многофункциональность, простота и удобство использования, поддержка нескольких языков, в т.ч. русского. Однако не все знают, что существует и бесплатный вариант, называющийся Power Tools Lite . Конечно, до полнофункциональной jv16 ему далеко, но для поиска данных, чистки и оптимизации реестра вполне подойдет. Замечу, что резервная копия создаваемая данной программой является всего лишь reg-файлом для восстановления состояния реестра до момента его изменения. Многие (если не большинство) программы для работы с реестром создают аналогичные копии, пригодные только для восстановления тех данных, которые они изменяют. В случае порчи реестра они вам не помогут. Поэтому, выбирая (особенно бесплатную) программу с возможностью резервного копирования реестра, разберитесь, какие же копии она создает. Идеальный вариант - программа, создающая копии всех кустов реестра. При наличии такой копии вы всегда сможете полностью восстановить реестр обычным копированием файлов. Я бы порекомендовал бесплатную консольную утилиту regsaver.exe Скачать, 380кб
Сайт программы.
Утилита сохраняет файлы реестра в каталог, указываемый в качестве параметра командной строки:
regsaver.exe D:\regbackup
После выполнения программы в каталоге D:\regbackup будет создан подкаталог с уникальным именем, состоящим из года, месяца, числа и времени создания резервной копии файлов реестра ("yyyymmddhhmmss"). После выполнения резервирования программа может выключить компьютер или перевести его в спящий режим:

regsaver.exe D:\regbackup /off /ask - Выключить компьютер. Ключ /ask требует подтверждения пользователя при выключении питания.
regsaver.exe D:\regbackup /standby - Перевести в спящий режим без подтверждения (нет /ask)
regsaver.exe D:\regbackup /hibernate /ask - Перевести в режим Hibernate

Вместо стандартного выключения компьютера можно использовать резервное копирование реестра с выключением по его завершению.

7. Восстановление реестра, при отсутствии резервных копий.

    К примеру, при загрузке системы, вы видите сообщение о нарушении целостности куста реестра SYSTEM:

Windows XP could not start because the following file is missing or corrupt: \WINDOWS\SYSTEM32\CONFIG\SYSTEM

Если у вас не выполнялось резервирование данных реестра, был отключен механизм создания контрольных точек восстановления или вы использовали Win2K, где этого механизма просто не существует, то все равно есть шансы оживить систему, загрузившись в другой ОС и восстановив файл system. Даже если содержимое этого файла будет не совсем актуальным, система, с большой долей вероятности, останется работоспособной. Возможно, придется переустановить некоторые программные продукты, или обновить драйверы.

  • - использование резервных файлов реестра, автоматически созданных каким-либо программным обеспечением. Откройте папку \Windows\system32\config и проверьте, нет ли в ней файла system.bak (возможно другое расширение, отличное от.alt и.log). переименуйте его в system и попробуйте загрузиться.
  • - использование, сохраненного после начальной установки, файла (файлов) из каталога \WINDOWS\REPAIR. Такой вариант, не самый оптимальный, на крайний случай.
  • - использование функции восстановления редактора реестра Windows XP при загрузке поврежденного куста.
    Редактор реестра позволяет открывать файлы не только "своего" реестра, но и файлы, являющиеся реестром другой операционной системы. В Windows 2000 для загрузки файла (куста) реестра сохраненного на диске использовался редактор regedt32.exe, в Windows XP функции regedt32.exe и regedit.exe совмещены и, дополнительно, появилась возможность восстановления поврежденного куста при загрузке. Для этого

    Загрузитесь в Windows XP (Windows Live, Winternals ERD Commander, установленная в другой каталог WinXP, другой компьютер с возможностью загрузки проблемного куста реестра по сети или с внешнего носителя). Запустите редактор реестра.
    В левой части дерева реестра выберите один из разделов:
    HKEY_USERS или HKEY_LOCAL_MACHINE.
    В меню Реестр (Registry) (В других версиях редактора реестра этот пункт меню может называться "Файл ") выберите команду "Загрузить куст(Load Hive)" .
    Найдите испорченный куст (в нашем случае - system).
    Нажмите кнопку Открыть .
    В поле Раздел введите имя, которое будет присвоено загружаемому кусту. Например BadSystem.
    После нажатия OK появится сообщение:

    В левом окне редактора реестра выберите подключенный куст (BadSystem) и выполните команду "Выгрузить куст" . Поврежденный system будет восстановлен. При чем, редактор реестра Windows XP вполне успешно восстановит реестр и более старой ОС Windows 2000.


    Мониторинг реестра.

        Одной из лучших программ для мониторинга реестра, с моей точки зрения, является RegMon Марка Руссиновича - маленькая и функциональная утилита, не требующая инсталляции и работающая в операционных системах Windows NT, 2000, XP, 2003, Windows 95, 98, Me и 64-разрядных версиях Windows для архитектуры x64. Скачать RegMon.exe v7.04, 700кб

        Regmon позволяет в реальном масштабе времени отслеживать, какие приложения обращаются к реестру, в какие разделы, какую информацию они читают или пишут. Информация выдается в удобном виде, который можно настроить под свои нужды - исключить из результатов мониторинга данные о работе с реестром неинтересных вам приложений, подчеркнуть выбранным цветом то, что считаете особо важным, включить в результаты мониторинга только выбранные процессы. Программа позволяет быстро и легко выполнить запуск редактора реестра с переходом к указанному разделу или параметру. Имеется возможность выполнять мониторинг в процессе загрузки операционной системы с записью результатов в специальный журнал %SystemRoot\Regmon.log.
        После старта RegMon, можно определить критерии фильтрации результатов мониторинга реестра:

    По умолчанию протоколируются все события обращения к реестру. Фильтр задается значениями полей:

    Include - Если * - выполнять мониторинг для всех процессов. Имена процессов разделяются символом ";" . Например - FAR.EXE;Winlogon.exe - будут фиксироваться обращения к реестру только для процессов far.exe и winlogon.exe.
    Exclude - какие процессы исключить из результатов мониторинга.
    Highlight - какие процессы выделить выбранным цветом (по умолчанию - красным).

        Значения полей фильтра запоминаются и выдаются при следующем старте Regmon. При нажатии кнопки Defaults выполняется сброс фильтра в установки по умолчанию - фиксировать все обращения к реестру. Значения полей фильтра удобнее формировать не при старте RegMon, а в процессе мониторинга, используя меню правой кнопки мыши для выбранного процесса - Include process - включить данный процесс в мониторинг, Exclude process - исключить данный процесс из мониторинга. После старта Regmon с фильтрами по умолчанию, вы увидите большое количество записей об обращении к реестру и, используя Include/Exclude process, можете настроить вывод результатов только нужного вам процесса (процессов).

    Назначение колонок:

    # - номер по порядку
    Time - Время. Формат времени можно изменить с помощью вкладки Options
    Process - имя процесса:идентификатор процесса (PID)
    Request - тип запроса. OpenKey - открытие ключа (подраздела) реестра, CloseKey - закрытие, CreateKey - создание, QueryKey - проверка наличия ключа и получение количества вложенных ключей (подразделов, subkeys), EnumerateKey - получить список имен подразделов указанного раздела, QueryValue - прочитать значение параметра, SetValue - записать значение.
    Path - путь в реестре.
    Result - результат выполнения операции. SUCCESS - успешно, NOT FOUND - ключ (параметр) не найден. ACCESS DENIED - доступ запрещен (недостаточно прав). Иногда бывает BUFFER OVERFLOW - переполнение буфера - результат операции не помещается в буфере программы.
    Other - дополнительная информация - результат выполненного запроса.

        Программа очень проста в использовании. После старта, лучше выбрать фильтр по умолчанию, т.е. фиксировать все обращения к реестру, а затем, в основном окне программы, выбрать ненужный процесс и с помощью правой кнопки мыши вызвать контекстное меню - Exclude process - информация об обращении к реестру данного процесса выводиться не будет. И таким же образом отфильтровать другие, не интересующие вас процессы.

        При работе с программой можно использовать меню File, Edit, Options или сочетание клавиш:

    CTRL-S - сохранить результаты
    CTRL-P - свойства выбранного процесса
    CTRL-E - включить/выключить мониторинг
    CTRL-F - поиск по контексту
    CTRL-C - копировать выбранную строку в буфер обмена
    CTRL-T - изменить формат времени
    CTRL-X - очистить окно результатов мониторинга
    CTRL-J - запустить редактор реестра и открыть ветвь указанную в колонке Path. Это же действие выполняется при двойном щелчке левой кнопки мыши. Очень полезная возможность, позволяет значительно экономить время.
    CTRL-A - включить/выключить автоматическую прокрутку
    CTRL-H - позволяет задать число строк результатов мониторинга

        Еще одна очень полезная возможность - получить журнал обращений к реестру в процессе загрузки операционной системы.
    Для этого выбираете меню Options-Log Boot . Программа выдаст сообщение, что Regmon сконфигурирован для записи обращений к реестру в файл журнала в процессе следующей перезагрузки ОС:

        После перезагрузки ОС, в корневом каталоге системы (C:\Windows) будет находиться файл Regmon.log с журналом результатов мониторинга. Режим записи в журнал будет продолжаться до запуска Regmon.exe вошедшим в систему пользователем и выполняется только для одной перезагрузки системы. Конечно же, содержимое журнала не будет полностью отображать абсолютно все обращения к реестру. Поскольку Regmon в режиме Log Boot инсталлируется в системе и, после перезагрузки, запускается в качестве драйвера, все обращения к реестру, произошедшие до его старта, в журнале не зафиксируются. Однако большая часть все же туда попадет, и вы увидите, что таких обращений будет несколько сотен тысяч.

    Для сохранения и восстановления реестра используется раздел "Disk and Files" - "SystemSaver". Для обслуживания и оптимизации реестра - "System Registry" - "RegistryFixer" и "RegistryDefrag".

    Кроме папки "Автозагрузка" для запуска программ используются разделы реестра:
    HKLM\Software\Microsoft\Windows\ CurrentVersion\Run
    HKLM\Software\Microsoft\Windows\ CurrentVersion\RunServices
    HKLM\Software\Microsoft\Windows\ CurrentVersion\RunOnce
    HKLM\Software\Microsoft\Windows\ CurrentVersion\RunServicesOnce
    Последние 2 раздела (...Once) отличаются тем, что программы,прописанные в них запускаются только 1 раз и после выполнения параметры ключа удаляются..

    Записи в HKLM относятся ко всем пользователям компьютера. Для текущего пользователя запуск определяется ключами в разделе HKU:
    HKCU\Software\Microsoft\Windows\ CurrentVersion\Run
    Пример раздела HKLM\...\RUN:

        В правом окне вы видите список параметров , значениями которых является строка, ссылающаяся на программу. При входе пользователя в систему, все перечисленные программы будут выполнены. Удалите параметр - программа не запустится. Но удалять можно не все. Поэкспериментируйте меняя расширение exe на ex_.

        Кроме программ, запускающихся при регистрации пользователя в системе, запускается еще огромное количество других, не всегда очевидных, - это и системные службы (сервисы), различные драйверы, программы оболочки (Shell) и т.п. Кроме полезных (а иногда и бесполезных) программ могут выполняться, используя автоматический запуск и внедрившиеся в систему вирусы. Более подробно о вирусах . Точек возможного автоматического запуска исполняемых модулей огромное множество, и для их поиска в реестре удобнее использовать специальные программы - мониторы автозапуска, наиболее популярной из которых, является , обладающей более широким спектром возможностей, чем служебная программа MSConfig, входящая в состав Windows.

    Инсталляция не требуется. Просто скачайте Autoruns, разархивируйте его и запустите файл Autoruns.exe (autorunsc.exe - консольная версия). Программа покажет, какие приложения настроены на автоматический запуск, а также представит полный список разделов реестра и каталогов файловой системы, которые могут использоваться для задания автоматического запуска. Элементы, которые показывает программа Autoruns, принадлежат к нескольким категориям: объекты, автоматически запускаемые при входе в систему, дополнительные компоненты проводника, дополнительные компоненты Internet Explorer (включая объекты модулей поддержки обозревателя (BHO)), библиотеки DLL инициализации приложений, подмены элементов, объекты, исполняемые на ранних стадиях загрузки, библиотеки DLL уведомлений Winlogon, службы Windows и многоуровневые поставщики услуг Winsock.
    Чтобы просмотреть автоматически запускаемые объекты требуемой категории, достаточно выбрать нужную вкладку.

        Для поиска записей в реестре, относящихся к выбранному объекту достаточно использовать пункт "Jump to" контекстного меню, вызываемого правой кнопкой мыши. Произойдет запуск редактора реестра и откроется ключ, обеспечивающий его запуск.


    Драйверы и службы.

    Информация о драйверах и системных службах (сервисах) находится в разделе
    HKLM\System\ CurrentControlSet\Services
    Каждому драйверу или сервису соответствует свой раздел. Например, "atapi" - для драйвера стандартного IDE контроллера жестких дисков, "DNScache" - для службы "DNS клиент". Назначение основных ключей:
    DisplayName - выводимое имя - то что вы видите в качестве осмысленного названия при использовании, например, элементов панели управления.

    ErrorControl - режим обработки ошибок.
    0 - игнорировать (Ignore) при ошибке загрузки или инициализации драйвера не выдается сообщение об ошибке и система продолжает работу.
    1 - нормальный (Normal) режим обработки ошибки. Работа системы продолжается после вывода сообщения об ошибке. Параметры ErrorControl для большинства драйверов устройств и системных служб равна 1.
    2 - особый (Severe) режим. Используется для обеспечения загрузки последней удачной конфигурации (LastKnownGood).
    3 - критическая (Critical) ошибка. Процесс загрузки останавливается, и выводится сообщение о сбое.

    Group - название группы, к которой относится драйвер, например - "Видеоадаптеры"

    ImagePath путь и имя исполняемого драйвера. Файлы драйверов обычно имеют расширение.sys и располагаются в папке \Windows\System32\DRIVERS\. Файлы сервисов - обычно.exe и располагаются в \Windows\System32\.

    Start управление загрузкой и инициализацией. Определяет, на каком этапе загрузки системы производится загрузка и инициализация данного драйвера или службы. Значения Start:
    0 - BOOT - драйвер загружается загрузчиком.
    1 - SYSTEM - драйвер загружается в процессе инициализации ядра.
    2 - AUTO - служба запускается автоматически при загрузке системы.
    3 - MANUAL - служба запускается вручную.
    4 - DISABLE - отключено.
    Загрузка драйверов и запуск служб с параметрами Start от 0 до 2 выполняются до регистрации пользователя в системе. Для отключения драйвера или службы достаточно установить значение Start равным 4. Отключение драйверов и служб через редактирование этого ключа реестра - довольно опасная операция. Если вы случайно или по незнанию отключите драйвер или сервис, без которых невозможна загрузка или работа - получите аварийное завершение системы (чаще всего - синий экран смерти BSOD).


    Драйверы и службы для безопасного режима.

    При загрузке операционной системы для инициализации драйверов и служб используется набор управляющих параметров из раздела текущей конфигурации
    HKLM\System\CurrentControlSet
    При возникновении проблем с работой операционной системы нередко используется безопасный режим загрузки (Safe Mode). Отличие данного режима от обычной загрузки, заключается в том, что используется минимально необходимая конфигурация драйверов и системных служб, перечень которых задается разделом:
    HKLM\System\ CurrentControlSet\Control\SafeBoot
    Подразделы:
    Minimal - список драйверов и служб, запускаемых в безопасном режиме (Safe Mode)
    Network - то же, но с поддержкой сети.

    Кроме раздела HKLM\System\CurrentControlSet, в реестре присутствуют и
    HKLM\System\CurrentControlSet001
    HKLM\System\CurrentControlSet002
    По своей структуре они идентичны HKLM\System\CurrentControlSet, и предназначены для дополнительной возможности восстановления работоспособности системы с использованием загрузки последней удачной конфигурации системы (Last Known Good Configuration). Возможные варианты загрузки управляющих наборов определяются содержимым раздела:
    HKLM\System\Select

    Current - управляющий набор, который был использован для текущей загрузки.
    Default - управляющий набор, который будет использоваться при следующей загрузке.
    LastKnownGood - управляющий набор, который будет использоваться, если будет выбран режим загрузки последней удачной конфигурации (Last Known Good Configuration).
    Failed - сбойный управляющий набор, который будет создан, если будет выбран режим загрузки последней удачной конфигурации (Last Known Good Configuration).
        После успешной загрузки и входа пользователя в систему, данные из CurrentControlSet и ControlSet001 копируются в ControlSet002. При изменении конфигурации, данные записываются в CurrentControlSet и ControlSet001. Если изменение настроек привело к краху системы, имеется возможность ее восстановления при использовании варианта последней успешной загрузки, берущей данные из ControlSet002. После удачной загрузки в этом режиме, появится новый подраздел с управляющим набором, ControlSet003, - на тот случай, если вам снова понадобится использовать Last Known Good Configuration. При каждом использовании загрузки последней удачной конфигурации значение ControlSet00x будет увеличиваться.

    Ограничиваем доступ пользователя к ресурсам.

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

    Скрываем логические диски

    Открываем раздел:
    HKCU\SOFTWARE\Microsoft\Windows\ CurrentVersion\Policies\Explorer
    и добавляем в него параметр NoDrives типа DWORD. Значение параметра определяет скрываемые диски A-Z. Наличие "1" начиная с младшего бита двойного слова означает отсутствие логического диска в "Мой компьютер"
    00000001 - нет диска A, 00000002 - нет диска B, 00000004 - нет диска C, 0000000F - нет дисков A-F
    Добавлю, что скрытые таким образом диски не видны только для Explorerа и в других программах могут быть доступны (в FAR например). Но другие программы ведь можно и скрыть или запретить - о чем дальше.

    Изменяем меню кнопки "ПУСК"

    NoRun =dword:00000001 нет кнопки "Выполнить"
    NoLogOff=hex:01 00 00 00 (не dword а hex) нет "Завершение сеанса "
    NoFind =dword:00000001 - нет пункта "Найти"
    NoFavoritesMenu =dword:00000001 нет "Избранное"
    NoRecentDocsMenu =dword:00000001 нет "Документы"
    NoSetFolders =dword:00000001 нет "Панели управления" в подменю "Настройка"
    NoSetTaskbar =dword:00000001 нет "Панель задач" там же
    NoPrinters =dword:00000001 нет "Принтеры" в Панели управления
    NoAddPrinter =dword:00000001 нет "Добавить принтер"
    NoDeletePrinter =dword:00000001 нет "Удалить принтер"
    NoDesktop =dword:00000001 Пустой рабочий стол
    NoNetHood =dword:00000001 нет "Сетевое окружение"
    NoInternetIcon =dword:00000001 нет значка "Интернет" на Рабочем столе Windows
    NoTrayContextMenu =hex:01,00,00,00 -Отключить меню, вызываемое правой кнопкой мыши на панели задач
    NoViewContextMenu =hex:01,00,00,00 - Отключить меню, вызываемое правой кнопкой мыши на Рабочем столе: Чтобы включить обратно, надо 01 заменить на 00.
    NoFileMenu =hex:01,00,00,00 скрыть " File " в верхней строке меню Проводника
    ClearRecentDocsOnExit =hex:01,00,00,00 не сохранять список последних открываемых документов по выходу из системы.

    Следующие параметры относятся к разделу реестра
    HKCU\Software\Microsoft\Windows\ CurrentVersion\Policies\
    Network

    NoNetSetup =dword:00000001 отключает доступ к значку "Сеть" в Панели управления
    NoFileSharingControl =dword:00000001 скрывает диалоговое окно управления совместным использованием файлов и принтеров, не позволяя пользователям управлять созданием новых совместных файлов или принтеров
    NoNetSetupIDPage =dword:00000001 скрывает вкладку "Идентификация"
    NoNetSetupSecurityPage =dword:00000001 скрывает вкладку "Управление доступом"
    NoEntireNetwork =dword:00000001 скрывает элемент "Вся сеть" в Сетевом окружении
    NoWorkgroupContents =dword:00000001 скрывает всё содержание Рабочей группы в Сетевом окружении

    Следующие параметры относятся к ограничениям для всех пользователей, поскольку используется раздел HKLM, а не HKEY_CURRENT_USER. Для редактирования данных нужно обладать правами администратора системы
    HKLM\SOFTWARE\Microsoft\Windows\ CurrentVersion\policies\System

    NoSecCPL =dword:00000001 отключает доступ к значку "Пароли" в Панели управления
    NoAdminPage =dword:00000001 скрывает вкладку "Удаленное управление"
    NoProfilePage =dword:00000001 скрывает вкладку "Профили пользователей"
    NoPwdPage "=dword:00000001 скрывает вкладку "Смена паролей"
    NoDispCPL =dword:00000001 отключает доступ к значку "Экран" в Панели управления
    NoDispAppearancePage =dword:00000001 скрывает "Оформление" в окне свойств экрана
    NoDispBackgroundPage =dword:00000001 скрывает "Фон" в окне свойств экрана
    NoDispScrSavPage скрывает "Заставка" в окне свойств экрана
    NoDispSettingsPage =dword:00000001 скрывает "Настройка" в окне свойств экрана
    NoConfigPage =dword:00000001 скрывает "Профили оборудования" в окне свойств системы
    NoDevMgrPage =dword:00000001 скрывает вкладку "Устройства" в окне свойств системы
    NoFileSysPage =dword:00000001 скрывает кнопку "Файловая система..." на вкладке "Быстродействие" в окне свойств системы
    NoVirtMemPage =dword:00000001 скрывает кнопку "Виртуальная память..." на вкладке "Быстродействие" в окне свойств системы
    =dword:00000001 запрет Regedit.exe или Regedt32.exe

        Некоторые из перечисленных запретов на действия пользователя используют не только системные администраторы, но и внедрившиеся в систему вирусы. Обычно выполняется запись в реестр данных, блокирующих возможность поиска и удаления внедрившегося вредоносного программного обеспечения и, в качестве завершающего аккорда - запрет на запуск редактора реестра (DisableRegistryTools). Как следствие, даже обладая правами администратора, пользователь не имеет возможности что-либо сделать со своим собственным реестром. Попытка запуска редактора завершается подобным сообщением:

    Конечно же, пользователю, тем более, администратору, должно быть обидно, когда "Редактирование реестра запрещено администратором системы". Поэтому я добавил еще один небольшой раздел:

    Обходим ограничения доступа пользователя к ресурсам.

        Все вышеперечисленные ограничения могут касаться либо конкретного пользователя, либо всех пользователей системы, точнее их учетных записей. Однако в каждой ОС Windows есть еще одна учетная запись, права которой, в некоторой степени, даже выше прав локального администратора - локальная системная учетная запись (Local System Account) от имени которой запускаются системные службы (сервисы) еще до входа пользователя в систему. Если программу (тот же regedit.exe) запустить с правами Local System, то никакие ограничения, связанные с учетными записями любых реальных пользователей действовать не будут. Как запустить редактор реестра с правами локальной системной учетной записи, используя утилиту PSExec, я уже рассказывал в начале статьи, и там же разместил ссылку на страничку загрузки и описания пакета PSTools. Для тех же, кому нет надобности в скачивании всего пакета и нужно, не разбираясь в тонкостях, просто обойти ограничения - пошаговая инструкция:
  • Скачиваем PSexec из пакета PSTools Microsoft (Sysinternals). (скачать PSTools.zip)
  • копируем его в папку \WINDOWS\SYSTEM32
  • запускаем с помощью psexec редактор реестра:
    psexec -s -i regedit.exe
    Для работы psexec.exe нужно обладать правами администратора т.е. пользователь должен входить в группу "Администраторы"
  • Вносим нужные исправления в реестр - DisableRegistryTools устанавливаем в 0 или удаляем его вообще. После чего пользуемся редактором реестра как обычно, снимая ограничения на запуск менеджера задач, блокировку антивирусных программ, и прочего, что там еще натворил вирус.

        Конечно, можно придумать и другие варианты обхода ограничений, как например, загрузка с использованием Winternals ERD Commander и редактирование проблемного реестра, или использование утилиты командной строки REG.EXE (Скачать bat-файл для разблокировки редактора реестра и менеджера задач) , или редактора реестра стороннего производителя, но данный способ - наиболее необычный, простой и быстрый. Необычность решения проблемы, как правило, дает то преимущество, что против ваших действий по обходу ограничений нет, или пока нет заранее подготовленных контрмер.
    Кстати, данным способом можно воспользоваться не только для запуска regedit.exe, но и других программ - проводника (Explorer.exe) например
    psexec -s -i C:\WINDOWS\EXPLORER.EXE
    что позволит получить доступ к каталогам и файлам, недоступным реальному пользователю, как, например, скрытая системная папка System Volume Information.

    Очень неплохой способ обхода ограничений - использование редактора реестра стороннего производителя.

    Resplendent Registrar Registry Manager - приблизительно 3Мб - в версии "Lite Edition" - бесплатный редактор реестра с удобным интерфейсом и полезными дополнительными возможностями по поиску, мониторингу, дефрагментации, сохранению и восстановлению реестра.

    В списке установленных программ висит программа давно удаленная

    Обычно это бывает, если вы удалили программу вручную, а не деинсталлировали ее, или же деинсталлятор глюканул. Исправить ситуацию можно отредактировав раздел:
    HKLM\Software\Microsoft\Windows\ CurrentVersion\Uninstall

    Постоянно приходится указывать путь на дистрибутив Windows

    Найдите раздел
    HKLM\Software\Microsoft\Windows\ CurrentVersion\Setup
    и в параметре SourcePath укажите путь на ваш дистрибутив -строковое значение "D:\install" . Если вы часто меняете настройки системы и у вас много места на диске - сбросьте дистрибутив в какой-либо каталог и пропишите его в SourcePath.

    Проблемы с русским шрифтом на некоторых программах

    Особенно это характерно на не русифицированных ОС, например Windows NT 4.0 Server. Даже если вы установили русифицированные фонты и в региональных установках указали Россию, проблемы с кириллическими шрифтами могут возникнуть. Откройте раздел
    HKLM\Software\Microsoft\Windows\ CurrentVersion\FontSubstitutes
    и пропишите параметры:
    параметр System,0 значение System,204
    параметр Courier,0 значение Courier,204
    параметр Arial,0 значение Arial,204
    параметр Courier New,0 значение Courier New,204
    параметр Times New Roman,0 значение Times New Roman,204
    Скорее всего эти параметры там уже есть, но вместо 204 стоит 238. Для Windows 9X такого раздела реестра нет и править надо секцию файла WINDOWS\win.ini.
    Может помочь также добавления в раздел HKLM\System\ CurrentControlSet\Control\Nls\CodePage параметра "1252" ="CP_1251.nls"

    Снятие пароля с заставки (ScreenSaver"а)

    Параметры рабочего стола для профиля по умолчанию задаются параметрами раздела реестра
    HKEY_USERS\.DEFAULT\Control Panel\Desktop
    Параметры рабочего стола текущего пользователя - разделом реестра
    HKCU\Control Panel\Desktop
    Для снятия пароля с заставки для рабочего стола текущего пользователя нужно открыть раздел реестра
    HKCU\Control Panel\Desktop
    и установить значение ключа ScreenSaverIsSecure равным нулю.

    Для отключения заставки - установить в 0 значение ScreenSaveActive

    Создание своего окна при входе в систему

    Это полезно тогда, когда требуется о чем-то предупредить пользователя. Раздел HKLM\SOFTWARE\Microsoft\Windows\ CurrentVersion\Winlogon
    Параметры:
    LegalNoticeCaption = например "Внимание!" текст заголовка окна
    LegalNoticeText = "С 25-го по 30-е число каждого месяца необходимо сменить пароль" текст в окне

    Очистка имени предыдущего пользователя

    Раздел HKLM\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\Winlogon
    DontDisplayLastUserName =dword:00000001

    Запрет на запуск редактора реестра и диспетчера задач.

    Для запрета запуска редактора реестра любого пользователя используется раздел HKLM\SOFTWARE\Microsoft\Windows\ CurrentVersion\policies\system
    =dword:00000001 запрещено запускать
    =dword:00000000 разрешено запускать
    DisableTaskMgr - =dword:00000001 запрещено запускать
    DisableTaskMgr - =dword:00000000 разрешено запускать
    Для ограничения запуска редактора реестра и диспетчера задач текущего пользователя аналогичные значения устанавливаются в разделе
    HKCU\Software\Microsoft\Windows\ CurrentVersion\Policies

    Обязательный ввод пароля в Windows 9X

    Должен быть установлен клиент Microsoft Network. Войти в систему, нажав ESC теперь не удастся
    Раздел HKLM\Network\Logon
    Параметр MustBeValidated =dword:00000001

    Изменить поведение компьютера при выключении

    Раздел HKLM\System\ CurrentControlSet\Control\Shutdown
    Параметр FastReboot равен 0 - обычное выключение, равен 1 - ускоренное, приводящее часто к перезагрузке

    Изменение языка по умолчанию в окне входа в систему

    Если в окне ввода пароля используется русская раскладка клавиатуры, то изменить это можно подредактировать раздел HKEY_USERS\.DEFAULT\Keyboard Layout\Preload. Он имеет 2 строковых параметра - "1" и "2".
    Если значения равны:
    1=00000409
    2=00000419
    то раскладка в окне входа в систему станет английской.
    Если значения параметрам присвоить наоборот ("1"=00000419, "2"= 00000409) - то раскладка станет русской.
  • Реестр

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

    Компонентам СОМ тоже требуется сохранять информацию о себе в реестре для того, чтобы клиенты могли к ним обращаться. Среда.NET Framework и предлагаемая в ней концепция установки с нулевым воздействием (zeroimpact installation) делает реестр чуть менее существенным для приложений, поскольку создаваемые с ее помощью сборки получаются полностью самодостаточными, т.е. никакой информации в реестр для них помещать не требуется, даже если они являются разделяемыми.

    Вдобавок в.NET Framework предлагается концепция изолированного хранилища (приложения могут хранить информацию, касающуюся каждого пользователя, в файлах) и.NET Framework самостоятельно заботится об отдельном хранении данных для каждого зарегистрированного в системе пользователя.

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

    Например, если приложение должно появляться в диалоговом окне Add/Remove Programs (Установка и удаление программ) панели управления, потребуется внести соответствующие записи в системный реестр. Системный реестр также может понадобиться для обеспечения обратной совместимости с унаследованным кодом.

    Как и следовало ожидать от такой обширной библиотеки, как.NET, в ней поставляются классы, которые позволяют получать доступ к реестру. Таких классов два - Registry и RegistryKey , и оба они находятся в пространстве имен Microsoft.Win32 . Прежде чем переходить к рассмотрению этих классов, давайте вкратце ознакомимся со структурой самого реестра.

    Реестр имеет иерархическую структуру, во многом похожую на структуру файловой системы. Обычно для просмотра и изменения содержимого реестра применяются две утилиты: regedit и regedt32 . Утилита regedit является стандартной и поставляется во всех версиях Windows, начиная с Windows 95. Утилита regedt32 входит в состав Windows NT и Windows 2000, и по сравнению с regedit менее дружественная к пользователю, но зато она позволяет получать доступ информации, связанной с безопасностью, которую regedit просматривать не позволяет.

    В Windows Server 2003 эти утилиты были объединены в единый новый редактор, который называется просто regedit. В ходе обсуждений здесь имеется в виду утилита regedit, поставляемая в Windows 7, которую можно запустить, введя regedit в диалоговом окне для запуска программ либо в командной строке.

    На рисунке показано, как выглядит окно regedit при запуске этой утилиты в первый раз. На этом рисунке видно, что regedit имеет пользовательский интерфейс в стиле "дерево/список", который похож на интерфейс проводника Windows и в точности отражает иерархическую структуру самого реестра. Однако вскоре будут показаны и некоторые важные отличия:

    В файловой системе узлы верхнего уровня представляют разделы дисков - С:\ , D:\ и т.д. В реестре эквивалентом разделов дисков являются разделы реестра (registry hive) . Изменять существующие разделы не допускается - они являются фиксированными и всего их семь, хотя в интерфейсе regedit видны только пять из них, которые перечислены ниже:

    HKEY_CLASSES_ROOT (HKCR)

    содержит детали, касающиеся типов файлов в системе (.txt, .doc и т.д.), и о том, какие приложения способны открывать файлы каждого из этих типов. Также содержит регистрационную информацию обо всех компонентах СОМ (она обычно занимает больше всего места в реестре, поскольку в Windows в настоящее время поставляется огромное количество разнообразных СОМ-компонентов).

    HKEY_CURRENT_USER (HKCU)

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

    HKEY_LOCAL_MACHINE (HKLM)

    представляет собой огромный раздел, в котором содержатся детали, касающиеся всего установленного на машине программного и аппаратного обеспечения. Также включает в себя раздел HKCU, который сам по себе не является отдельным разделом, а просто удобным отображением ключа реестра HKLM/SOFTWARE/Classes.

    HKEY_USERS (HKUSR)

    содержит детали, касающиеся предпочтений всех пользователей. Как не трудно догадаться, он тоже содержит разделы HKCU, которые являются просто отображением соответствующих ключей HKEY_USERS.

    HKEY_CURRENT_CONFIG (HKCF)

    содержит детали, касающиеся конфигурации установленного на машине оборудования.

    В остальных двух корневых разделах размещается информация, которая является временной и часто изменяющейся:

    HKEY_DYN_DATA

    является общим контейнером для любых текущих данных, которые требуется сохранять где-нибудь в реестре.

    HKEY_PERFORMANCE_DATA

    содержит информацию, касающуюся производительности функционирующих в текущий момент приложений.

    Внутри разделов находится древовидная структура ключей реестра. Каждый из них во многом напоминает папку или файл в файловой системе. Однако между ними имеется одно очень важное отличие. В файловой системе различаются файлы (в которых хранятся данные) и папки (в которых главным образом содержатся другие файлы или папки), а в реестре присутствуют только ключи. В каждом ключе могут содержаться как данные, так и другие ключи.

    Если ключ содержит данные, то они представлены последовательностью значений. Каждое значение имеет ассоциированное с ним имя, тип данных и собственно данные. Вдобавок ключ имеет безымянное значение по умолчанию.

    Всю эту структуру можно увидеть, используя утилиту regedit. На рисунке показано содержимое ключа HKCU\Console:

    Записи в системном реестре могут иметь формат одного из трех типов данных:

      REG_SZ (приблизительно соответствует экземпляру строки в.NET, но это сходство не точное, поскольку типы данных реестра не являются типами данных.NET);

      REG_DWORD (приблизительно соответствует типу uint);

      REG_BINARY (массив байт).

    Приложение, предусматривающее сохранение каких-то данных в реестре, будет делать это за счет создания ряда ключей, причем обычно внутри ключа HKLM\Software\<Название компании>. Обратите внимание, что в этих ключах вовсе не обязательно должны содержаться какие-либо данные. Порой сам факт существования ключа позволяет приложению получать те данные, которые ему необходимы.

    Как уже говорилось, доступ к реестру позволяют получать два класса из пространства имен Microsoft.Win32: Registry и RegistryKey. Экземпляр RegistryKey представляет ключ реестра. В этом классе есть методы для просмотра дочерних ключей, для создания новых ключей, а также для чтения и изменения значений в существующих ключах, т.е. можно выполнять все, что обычно требуется делать с ключами реестра, в том числе устанавливать для них уровни безопасности. Именно этот класс применяется для выполнения большей части работы с реестром.

    В отличие от него, Registry представляет собой класс, который позволяет получать эксклюзивный доступ к ключам реестра для выполнения простых операций. Другим предназначением класса Registry является предоставление экземпляров RegistryKey, представляющих ключи наивысшего уровня, т.е. разделы, которые позволяют осуществлять навигацию по реестру. Предоставляются эти экземпляры через семь статических свойств со следующими именами: ClassesRoot, CurrentConfig, CurrentUser, DynData, LocalMachine, PerformanceData и Users. Каким разделам соответствуют эти свойства, должно быть вполне очевидно.

    Например, для получения экземпляра RegistryKey, представляющего ключ HKLM, потребуется написать такой код:

    RegistryKey hklm = Registry.LocalMachine;

    Процесс получения ссылки на объект RegistryKey называется открытием ключа . Хотя можно было бы ожидать, что, поскольку реестр имеет такую же иерархическую структуру, что и файловая система, методы, предлагаемые классом RegistryKey, должны быть похожими на те, что реализованы в DirectoryInfo, на самом деле это не так. Часто способ доступа к реестру отличается от способа использования файлов и папок, и RegistryKey реализует методы, отражающие это.

    Наиболее очевидное отличие связано с тем, как открывается ключ в определенном месте реестра. Класс Registry не имеет никакого общедоступного конструктора, который можно было бы использовать, равно как не имеет и методов, которые позволяли бы переходить к ключу по имени напрямую. Вместо этого добираться до нужного ключа придется от самого верхнего раздела.

    Если необходимо создать экземпляр объекта RegistryKey, то единственно возможный способ предусматривает начать с соответствующего статического свойства класса Registry и оттуда уже двигаться вниз. То есть, например, для чтения данных из ключа HKLM\Software\Microsoft потребуется получить на него ссылку следующим образом:

    RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftware = hklm.OpenSubKey("Software"); RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft");

    Доступ к ключу подобным образом позволяет осуществлять только чтение. Если необходимо выполнить запись каких-то данных в ключ (в том числе запись его значения, а также создание или удаление его непосредственных дочерних элементов), потребуется использовать другую переопределенную версию OpenSubKey . Она принимает во втором параметре значение типа bool, указывающее, должен ли доступ к ключу предоставляться не только для чтения, но и для записи. Например, чтобы получить возможность изменить ключ Microsoft (имея права системного администратора), потребуется написать следующий код:

    RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftware = hklm.OpenSubKey("Software"); RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft", true);

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

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

    RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftware = hklm.OpenSubKey("Software"); RegistryKey hkMine = hkSoftware.CreateSubKey("MyOwnSoftware");

    Способ, которым работает метод CreateSubKey(), является довольно интересным. Он создает ключ, если его не существует, а если ключ существует, метод просто возвращает экземпляр RegistryKey, который представляет существующий ключ. Причина, по которой этот метод ведет себя подобным образом, связана с тем, как обычно используется реестр. В реестре в целом содержатся подлежащие длительному хранению данные наподобие конфигурационной информации для Windows и различных приложений. Поэтому необходимость создавать ключ явным образом возникает не очень часто.

    Гораздо чаще приложениям требуется проверять наличие некоторой информации в реестре - другими словами, создавать ключи, если они еще не существуют, и ничего не делать, если ключи уже там есть. Метод CreateSubKey() просто идеально позволяет удовлетворить такую потребность. В отличие от ситуации с FileInfo.Open(), в случае применения CreateSubKey() случайное удаление каких-нибудь данных исключается. Если же на самом деле необходимо удалить какие-то ключи реестра, потребуется вызвать метод DeleteSubKey() .

    Учитывая важность реестра для Windows, в этом есть смысл. Вряд ли кому-то понравится перспектива случайно вывести систему Windows из строя, просто удалив несколько важных ключей во время отладки самостоятельно написанного кода C#, который работает с системным реестром.

    После обнаружения подлежащего чтению или модификации ключа можно с помощью метода SetValue() или GetValue() , соответственно, установить либо извлечь данные из него. Оба эти метода принимают в качестве параметра строку с именем значения, но SetValue() также требуется дополнительно передать в качестве параметра ссылку на объект, который содержит детали, касающиеся значения. Поскольку по определению этот параметр должен представлять собой ссылку на объект, он на самом деле может быть ссылкой на любой класс. По типу предоставляемого класса метод SetValue() и будет определять тип для значения - REG_SZ, REG DWORD или REG_BINARY. Например:

    RegistryKey hkMine = HkSoftware.CreateSubKey("MyOwnSoftware") ; hkMine.SetValue("MyStringValue", "Hello World"); hkMine.SetValue("MyIntValue", 20);

    В этом коде для ключа устанавливаются два значения: MyStringValue с типом REG_SZ и MyIntValue с типом REG_DWORD.

    »), в котором собраны некоторые примеры по применению вышеозначенных функций.




    1. Краткое пояснение. Изначальная постановка задачи.


    Была поставлена задача: создать пользовательский «MessageBox», который, кроме стандартных элементов типа «текст» и «кнопки», имел бы еще и «CheckBox», перевод которого в состояние «установлено» должен был бы приводить к тому, что это сообщение больше не будет показано.

    Соответственно, эта информация должна быть сохранена в реестре. Причем в виде пары значений: «StringId» (все тексты должны быть внесены в «string table» из-за поддержки многоязычности в проекте) + «Flag» (т.е. состояние этого «CheckBox»).



    Благодаря этому и появился вышеупомянутый класс для работы с реестром.


    2. Общая информация.


    2.1. Общий принцип построения реестра.


    Реестр имеет иерархическую структуру, аналогичную каталогу (вложенные папки, деревья). Корневые элементы представляют собой установленные Майкрософтом константы.


    HKEY_CLASSES_ROOT
    HKEY_CURRENT_CONFIG
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    Каждый из корневых элементов - корневых ключей - имеет подключи - папки (далее - ключи или подключи), те, в свою очередь, тоже могут иметь свои подключи и т.д. В подключе, находящемся в этой цепочке, могут содержаться параметры и соответствующие им значения. Например:


    HKEY_LOCAL_MACHINE
    SOFTWARE
    Microsoft
    IE4
    Setup
    Path = "%programfiles%\Internet Explorer"


    В примере:

    • HKEY_LOCAL_MACHINE - корневой ключ.
    • Path - параметр;
    • все остальные - подключи.


    2.2. Наши возможности.


    С помощью стандартных функций мы можем:

    • считывать и запоминать имена ключей и параметров;
    • считывать и запоминать значения параметров;
    • создавать и удалять ключи;
    • получать общую информацию о ключах и их параметрах.

    3. Описание функций.


    3.1. Открываем и закрываем реестр.


    Эти две команды - основа основ. И они самые простые в использовании. ;-)


    Открываем реестр.


    CRegistryManip::OpenRegKey (
    const HKEY hKey,
    const TCHAR* pSubKey,
    HKEY& hKeyPrograms,
    REGSAM samDesired = KEY_READ
    );

      • HKEY_CLASSES_ROOT ,
      • HKEY_CURRENT_CONFIG ,
      • HKEY_CURRENT_USER ,
      • HKEY_LOCAL_MACHINE ,
      • HKEY_USERS ;
    • pSubKey - подраздел в реестре, который нас интересует (например: «Microsoft\IE4\Setup»);
    • hKeyPrograms - указатель на handle (описатель) открытого ключа;
    • samDesired - уровень доступа (для чтения значений, для чтения имен параметров, записи, создания ключей и т.д.):
      • KEY_ALL_ACCESS - максимальный доступ. Представляет собой комбинацию ключей: KEY_QUERY_VALUE , KEY_ENUMERATE_SUB_KEYS , KEY_NOTIFY , KEY_CREATE_SUB_KEY , KEY_CREATE_LINK и KEY_SET_VALUE ;
      • KEY_READ - для чтения информации из реестра. Представляет собой комбинацию ключей: KEY_QUERY_VALUE , KEY_ENUMERATE_SUB_KEYS и KEY_NOTIFY ;
      • KEY_WRITE - для записи информации в реестр. Представляет собой комбинацию ключей: KEY_SET_VALUE и KEY_CREATE_SUB_KEY ;
      • KEY_QUERY_VALUE - для опроса значений параметров;
      • KEY_ENUMERATE_SUB_KEYS - для чтения имен подключей;
      • KEY_NOTIFY - для изменения нотификаций;
      • KEY_CREATE_SUB_KEY - для создания подключа;
      • KEY_CREATE_LINK - для создания линка;
      • KEY_SET_VALUE - для установки значений параметров.

    Чтобы открыть ключ, используем стандартную функцию RegOpenKeyEx() .


    Краткое описание функции RegOpenKeyEx() .


    Эта функция получает: hKey - имя корневого ключа в реестре, pSubKey - имя подключа, который мы хотим открыть и samDesired - уровень доступа к информации. В случае удачного завершения функция возвращает hKeyPrograms - указатель на открытый ключ.

    Возвращаемое значение функции::RegOpenKeyEx() - тип ULONG . Значение ERROR_SUCCESS означает благополучное завершение выполнения функции, все остальное говорит о том, что нам где-то и в чем-то не повезло. ;-)





    HKEY hKeyPrograms = NULL;
    ULONG nRes = OpenRegKey (
    HKEY_LOCAL_MACHINE,
    cstrSubKey,
    hKeyPrograms
    );


    Закрываем реестр.


    (Какой-либо ключ, который был перед этим открыт с помощью OpenRegKey() .)


    CRegistryManip::CloseRegKey(
    HKEY hKey
    );


    Где hKey - тот самый указатель на handle (описатель) открытого ключа, который нам вернула функция OpenRegKey() .


    Чтобы закрыть ключ используем стандартную функцию RegCloseKey() .


    Краткое описание функции RegCloseKey() .


    Эта функция получает hKey - указатель на открытый ключ. Она закрывает наш сеанс работы с реестром, открытый функцией RegOpenKeyEx() . Эти функции всегда должны вызываться в паре.



    Вызов выглядит следующим образом:


    CString cstrSubKey (_T("SOFTWARE\\Microsoft\\IE4\\Setup"));
    HKEY hKeyPrograms = NULL;
    BOOL bRes = OpenRegKey (
    HKEY_LOCAL_MACHINE,
    cstrSubKey,
    hKeyPrograms
    );

    bRes = CloseRegKey (hKeyPrograms);


    3.2. Проверяем наличие ключа в реестре.


    Мы можем проверить, существует ли в реестре нужный нам ключ. Например, «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IE4\Setup».


    CRegistryManip::CheckIfKeyExists (
    const HKEY hKey,
    const TCHAR* pSubKey
    );

    • hKey - один из корневых ключей в реестре:
      • HKEY_CLASSES_ROOT ,
      • HKEY_CURRENT_CONFIG ,
      • HKEY_CURRENT_USER ,
      • HKEY_LOCAL_MACHINE ,
      • HKEY_USERS ;
    • pSubKey - подраздел в реестре, который нас интересует (в нашем случае: «SOFTWARE\Microsoft\IE4\Setup»).

    Для проверки нам достаточно вызвать функцию OpenRegKey() : если интересующий нас ключ существует, функция вернет TRUE , иначе - FALSE .

    Вызов выглядит следующим образом:


    CString cstrSubKey (_T("SOFTWARE\\Microsoft\\IE4\\Setup"));
    BOOL bRes = OpenRegKey (
    HKEY_LOCAL_MACHINE,
    cstrSubKey
    );


    3.3. Создаем новый ключ.


    Например, «HKEY_LOCAL_MACHINE\SOFTWARE\Irina».


    CRegistryManip::CreateNewKey (
    const HKEY hKeyBase,
    const TCHAR* pKeyPath,
    const TCHAR* pNewKey
    );

    • hKeyBase - один из корневых ключей в реестре:
      • HKEY_CLASSES_ROOT ,
      • HKEY_CURRENT_CONFIG ,
      • HKEY_CURRENT_USER ,
      • HKEY_LOCAL_MACHINE ,
      • HKEY_USERS ;
    • pKeyPath - подраздел в реестре, который нас интересует (в нашем случае: «SOFTWARE»). Этот ключ - родитель для нашего нового ключа;
    • pNewKey - наш новый ключ (в нашем случае - «Irina»).

    Чтобы создать ключ, используем стандартную функцию RegCreateKeyEx() .


    Краткое описание функции RegCreateKeyEx() .


    Эта функция получает hKey (имя основного ключа в реестре), pSubKeyNew = pKeyPath (имя подключа, который мы хотим открыть) + pNewKey (имя нового подключа) и samDesired (уровень доступа к информации).

    В случае удачного завершения функция возвращает hKeyPrograms (указатель на созданный подключ).


    В списке есть еще некоторые параметры:

    • lpClass - имя класса (Я долго искала какую-либо информацию о том, каково практическое применение этого параметра, но ничего умного не нашла... Во всех приводимых примерах этот параметр равен NULL . Я последовала примеру. ;-) Если кто-то сможет меня поправить в этом вопросе, буду премного благодарна.);
    • dwOptions - специальный флаг, который по умолчанию равен REG_OPTION_NON_VOLATILE . В обычной жизни этого хватает (Особо осложненные жизненные обстоятельства я не рассматривала, так как у меня на это просто не было времени. Но я думаю, что при необходимости всегда можно найти нужную информацию.);
    • lpSecurityAttributes - устанавливает правила для наследования (использования) полученного указателя на созданный подключ процессами - детьми основного процесса. Опять же, в обычной жизни может быть без зазрения совести равен NULL ;
    • lpdwDisposition - флаг, который говорит о том, что либо этот ключ уже существует, либо еще нет и должен быть создан. Если установить его в NULL , то система сама решает, что ей делать исходя из наличия или отсутствия заданного ключа. То есть, если ключ уже существует, функция работает как RegOpenKeyEx() , если нет - она создает заданный ключ;
    • samDesired - уровень доступа к информации в реестре. Для создания ключа должен быть установлен как минимум равным KEY_CREATE_SUB_KEY (но лучше всего - KEY_ALL_ACCESS).

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


    Вызов выглядит следующим образом:


    CString cstrSubKey (_T("SOFTWARE"));
    CString cstrNewKey (_T("Irina"));
    BOOL bRes = CreateNewKey (
    HKEY_LOCAL_MACHINE,
    cstrSubKey,
    cstrNewKey
    );


    3.4. Удаляем подключ или параметр из реестра.


    CRegistryManip::DeleteInfoFromRegistry (
    const HKEY hKey,
    const char* pSubKey,
    const TCHAR* pKeyName
    );

    • pSubKey - подраздел в реестре, который нас интересует (например: «SOFTWARE\Irina»);
    • pKeyName - имя параметра (Например, подключ «Irina» иммет параметр «StringID» со значением, равным 2000. В этом случае pKeyName равно «StringID».).

    Вызов выглядит следующим образом:


    BOOL bRes = FALSE;

    // удаление параметра

    HKEY_LOCAL_MACHINE,
    _T("SOFTWARE\\Irina"),
    _T("StringID")
    );

    // удаление подключа
    bRes = DeleteInfoFromRegistry (
    HKEY_LOCAL_MACHINE,
    _T("SOFTWARE\\Irina"),
    NULL
    );


    Удаляем подключ.


    CRegistryManip::DeleteSubKeyFromRegistry (
    const HKEY hKey,
    const char* pSubKey
    );


    Чтобы удалить подключ, используем стандартную функцию RegDeleteKey() .


    Краткое описание функции RegDeleteKey() .


    Эта функция получает:

    • pSubKey - имя подключа, который мы хотим удалить.

    Удаляем параметр.


    CRegistryManip::DeleteParamFromRegistry (
    const HKEY hKey,
    const char* pSubKey,
    const TCHAR* pKeyName
    );


    Если речь идет о подключе, то достаточно вызова стандартной функции RegDeleteKey() .

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

    При открытии реестра уровень доступа должен быть как минимум KEY_SET_VALUE . Для удаления параметра используем стандартную функцию RegDeleteValue() .


    Краткое описание функции RegDeleteValue() .


    Эта функция получает:

    • hKey - указатель на открытый ключ;
    • lpValueName - имя параметра, который мы хотим удалить.

    3.5. Устанавливаем значение параметра.


    Например:


    HKEY_LOCAL_MACHINE\\SOFTWARE\\Irina - подключ
    StringId = 2000 (StringId - это имя параметра, 2000 - его значение)


    CRegistryManip::SetOneValue (
    HKEY hKey,
    const TCHAR* pKeyName,
    const TCHAR* pKeyVal,
    DWORD dwType = REG_SZ
    );

    • pKeyName - имя параметра;
    • pKeyVal - значение параметра;
    • dwType - тип параметра.

    Чтобы установить параметр, используем стандартную функцию RegSetValueEx() .


    Краткое описание функции RegSetValueEx() .


    Эта функция получает:

    • hKey - указатель на открытый ключ;
    • pKeyName - имя параметра, значение которого мы хотим установить;
    • dwType - тип данных;
    • lpData - адрес переменной (т.е. области памяти), в которую будет помещен результат (тип этой переменной зависит от типа данных);
    • cbData - размер области этой памяти.

    Если тип данных - REG_SZ , то для получения результата надо создать массив типа char (или TCHAR , если мы работаем с Unicode).

    Если тип данных - REG_BINARY , то для получения результата надо создать переменную типа int .

    Если тип дfанных - REG_DWORD , то для получения результата надо создать переменную типа DWORD .


    Применение преобразования любого из этих типов данных в (BYTE*) необходимо для получения правильного результата.



    Вызов выглядит следующим образом:


    CString cstrSubKey (_T("SOFTWARE\\Irina"));
    CString cstrParName (_T("StringID"));
    CString cstrParVal (_T("2000"));
    HKEY hKeyPrograms = NULL;

    // Сначала вызываем
    // OpenRegKey(HKEY_LOCAL_MACHINE, cstrSubKey, hKeyPrograms),
    // т.к. сначала надо открыть ключ, в котором находится
    // наш параметр, затем вызываем функцию по установке
    // значения параметра. В данном случае мы не передаем тип,
    // т.к. он по умолчанию уже установлен как REG_SZ.

    ULONG nRes = SetOneValue (
    hKeyPrograms,
    cstrParName,
    cstrParVal
    );

    // В конце закрываем реестр: CloseRegKey(hKeyPrograms).


    3.6. Получаем значение параметра.


    CRegistryManip::getInfoFromRegistry (
    const HKEY hKey,
    const TCHAR* pSubKey,
    const TCHAR* pRegKey,
    TCHAR *pRes,
    DWORD dwType = REG_SZ
    );

    • hKey - один из корневых ключей в реестре: HKEY_CLASSES_ROOT и т.д.;
    • pSubKey - подраздел в реестре, который нас интересует (например, «Software\Irina»);
    • pKeyName - имя параметра (например: «StringID»);
    • pRes - значение параметра (возвращаемое этой функцией);
    • dwTyp e - тип параметра.

    Сама функция осуществляет следующие действия: открывает реестр и вызывает долонительную функцию CRegistryManip::GetOneValueFromReg() , которая считывает информацию из реестра в зависимости от типа данных:


    CRegistryManip::GetOneValueFromReg (
    HKEY hKey,
    const TCHAR* pRegKey,
    TCHAR *pRes,
    DWORD dwType = REG_SZ
    );

    • hKey - указатель на handle (описатель) открытого ключа, который нам вернула функция OpenRegKey() ;
    • pRegKey - имя параметра (например, «StringID»);
    • pRes - значение параметра, возвращаемое этой функцией;
    • dwType - тип параметра.

    Для получения значения используем стандартную функцию RegQueryValueEx() .


    Краткое описание функции RegQueryValueEx() .


    Эта функция получает следующие параметры:

    • hKey - указатель на открытый ключ;
    • lpValueName - имя параметра, значение которого мы хотим получить;
    • lpReserved - зарезервированное значение, равно NULL ;
    • lpType - адрес переменной (т.е. области памяти), в которую будет помещен тип результата;
    • lpData - адрес переменной, в которую будет помещен результат. В зависимости от типа данных контейнером для получения значения выступает либо строка символов, либо переменная типа int ;
    • lpcbData - адрес переменной, в которой находится размер переменной, предназначенной для помещения в нее результата.

    Применение преобразования любого из этих типов данных в (BYTE*) необходимо для получения правильного результата. Вызов выглядит следующим образом (я беру пример вызова этой функции из getInfoFromRegistry()):



    HKEY hKeyPrograms; // получим при вызове OpenRegKey()
    TCHAR dwBuffer;
    GetOneValueFromReg(hKeyPrograms, pRegKey, dwBuffer, dwType);


    3.7. Получаем количество параметров.


    Например:


    HKEY_LOCAL_MACHINE\\SOFTWARE\\Irina - папка (подключ)
    StringId -> параметр
    Flag -> параметр
    Param_bin -> параметр


    Итого в папке 3 параметра. Наша задача - получить это количество программным путем.


    CRegistryManip::GetCountOfSubKeys (
    HKEY hKey,
    unsigned long& nSubKeysCount
    );

    • hKey - указатель на handle (описатель) открытого ключа, который нам возвращает функция OpenRegKey() ;
    • nSubKeysCount - количество параметров, возвращаемое функцией значение.

    Для получения этой информации используем стандартную функцию RegQueryInfoKey() .


    Краткое описание функции RegQueryInfoKey() .

    • hKey - указатель на открытый ключ в реестре, который нас интересует;
    • lpClass - адрес переменной, где находится имя класса;
    • lpcbClass - адрес переменной, в которой находится размер буфера для имени класса;
    • lpReserved - зарезервированный параметр, равен NULL ;
    • lpcSubKeys - адрес переменной, в которой находится результат - количество подключей;
    • lpcbMaxSubKeyLen - адрес переменной, в которой находится длина для имени подключа;
    • lpcbMaxClassLen - адрес переменной, в которой находится длина буфера, предназначенного для хранения имени класса;
    • lpcValues - адрес переменной, в которой находится еще один результат - количество параметров в данном ключе;
    • lpcbMaxValueNameLen - адрес переменной, в которой находится размер буфера для имени параметра или подключа;
    • lpcbMaxValueLen - адрес переменной, в которой находится размер буфера для значения параметра;
    • lpcbSecurityDescriptor - адрес переменной, в которой может находиться security-информация;
    • lpftLastWriteTime - адрес переменной типа FILETIME , в которой находится время последнего изменения этого ключа.

    Для некоторых пользователей уже успела стать любимой операционной системой, но многие даже и не догадываются, сколько всего интересного и полезного есть в этой операционке. В данной статье мы не будем делать обзор Windows XP , на эту тему уже написано немало статей и обзоров. Поговорим о различных интересных настройках, которые можно сделать с помощью реестра Windows.

    Конечно, Windows XP позволяет работать с разного рода настройками и без реестра, но все же не все удастся сделать стандартными средствами. Конечно, существуют много программ для настройки Windows, но они стоят денег, а мы люди небогатые, но честные, поэтому не станем пользоваться нелицензированным программным обеспечением:-). Да и вообще, знать реестр полезно, когда-нибудь да пригодится.

    Итак, что же вообще собой представляет реестр, и где он находится? Реестр - это как бы большая база данных операционной системы, в которой хранятся различные настройки вашего компьютера. Настройки, как программного обеспечения, так и аппаратного (монитор, видеокарта и т.д.). Структура реестра такова: существуют 5 основных разделов (их еще иногда называют «кусты»), в каждом из которых находятся подразделы, и, наконец, в каждом из этих подразделов имеются параметры (или «ключи»). Изменением этих параметров («ключей») мы и займемся.

    Как же нам добраться до реестра? Очень просто! Для этого предусмотрена специальная программа, входящая в состав Windows XP (она имеется и во всех предыдущих версиях Windows). Называется она Regedit. Для того чтобы ее открыть, нужно в меню Start (Пуск) выбрать Run (Выполнить). В появившемся окошке пишите regedit (без кавычек). Слева мы наблюдаем разделы и подразделы, а справа находятся ключи (или параметры).

    Давайте быстренько пробежимся по всем разделам и узнаем, за что каждый из них отвечает.

    HKEY_CLASSES_ROOT
    Здесь хранится база данных всех расширений, которые только встречаются на данном компьютере, и соответственно, для каждого расширения указана программа, его понимающая.

    HKEY_CURRENT_USER
    Все настройки текущего пользователя записаны здесь.

    HKEY_LOCAL_MACHINE
    В этом разделе хранятся все настройки вашего компьютера (то есть информация как аппаратного, так и программного обеспечения).

    HKEY_USERS
    Тут содержатся настройки всех пользователей.

    HKEY_CURRENT_CONFIG
    Сюда занесены сведения о настройках оборудования (текущей конфигурации вашего ПК).

    Теперь кратко рассмотрим, как записываются параметры или ключи. Каждый ключ имеет свое имя, тип и значение. С именем все ясно, а вот на типе нужно остановиться немного подробнее. Если вы имели дело с программированием, то и с этим вопросом у вас никаких проблем не возникнет. А вот для тех, кому слово «программирование» ничего не говорит, я немножко объясню, рассмотрев типы по отдельности.

    REG_BINARY
    Это бинарный (или двоичный) тип. То есть сюда входят только две цифры - 1 и 0. Он не очень привычен для нас, но для компьютера типа лучшего, чем этот, просто не найти… :-)

    REG_DWORD
    Это целочисленный тип. Многие параметры служб и драйверов устройств имеют этот тип и отображаются в двоичном, шестнадцатеричном или десятичном форматах.

    REG_EXPAND_SZ
    Это строковый тип.

    REG_MULTI_SZ
    Тип, похожий на предыдущий. Но, это не одна строка, а набор строк.

    REG_SZ
    То же строковый тип, но в отличие от REG_EXPAND_SZ, это строка фиксированной длины.

    Ну, вот вроде бы и разобрались немного с реестром, теперь давайте перейдем непосредственно к настройке нашей любимой Windows XP. Вначале мы будем настраивать/оптимизировать такую любимую и многими используемую программу, как Internet Explorer. Что ж приступим.

    Для начала давайте спрячем некоторые настройки от «левых» пользователей, чтобы никто не мог изменить параметры вашего браузера. Скроем вкладку General (Общее). Для этого найдем раздел HKEY_CURRENT_USER\Software\Policies\Microsoft. В нем создайте еще один подраздел (new > key) и назовите его Internet Explorer. Затем в только что созданном подразделе сформируйте еще один key (на подразделе Internet Explorer нажимаем правой кнопкой мышки, выбираем new > key). Назовите этот ключик Control Panel. Все, теперь выделяем Control Panel и в правой части окна Regedit создаем новый параметр типа DWORD с названием GeneralTab. Присвойте этому параметру значение 1 или 0 (если захотите вновь вернуть вкладку General (Общее).

    Теперь замаскируем вкладку Security (Безопасность). Для чего в этом же разделе (Internet Explorer > Control Panel) создаем параметр типа DWORD. Имя параметра SecurityTab, значение - 1.

    Продолжая продвижение в таком важном деле, как конспирация, скроем далее Privacy (Конфиденциальность). Создаем параметр PrivacyTab типа DWORD, со значением 1. Далее у нас идет вкладка Content Tab (Содержание). Вновь создаем параметр ContentTab, того же типа и с тем же значением. Еще у нас осталось 3 вкладки для скрывания. Создаем дополнительно три параметра с именами ConnectionsTab (убираем вкладку Подключение), ProgramsTab (это вкладка Программы), AdvancedTab (вкладка Дополнительно). Все эти параметры имеют тип DWORD и значение, равное 1.

    Все, со скрытием настроек закончили. Когда вы что-то качаете из Инета с помощью браузера, то все это сохраняется в папке C:\Documents and Settings\Current User\Desktop. Чтобы файлы помещались в другую папку, в разделе HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer поменяйте значение параметра Download Directory на путь к нужному каталогу.

    Если вам не нравится, как раскрашена панель инструментов, то вы можете самостоятельно поменять рисунок. Для этого в HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Toolbar создайте параметр с именем BackBitmap (наподобие параметра String Value). Значение - это путь к файлу с рисунком, который вам нравится (расширение *.bmp), например, c:\picture.bmp (только без кавычек).

    Для того чтобы изменить заголовок программы Internet Explorer, в разделе HKEY_CURRENT_USER\ Software\ Microsoft\ Internet Explorer\ Main нужно создать параметр типа String Value с именем Window Title. Значение этого параметра - это и есть название окна Internet Explorer.

    Если вы не хотите, чтобы кто-то мог изменить панель инструментов, в разделе HKEY_CURRENT_USER\ Software\ Microsoft\ Windows\ CurrentVersion\ Policies\ Explorer создайте параметр NoToolbarCustomize типа DWORD. В качестве значения параметра необходимо выставить 1.

    С Internet Explorer немного разобрались. Это, конечно, далеко не все настройки, которые можно сделать с помощью реестра, существует масса других возможностей. Мы же далее перейдем к различным настройкам Windows XP (так сказать, общим настройкам системы).

    Если вы - не единственный хозяин своего компьютера, но хотите, чтобы ваши настройки никто не менял, то есть два способа осуществить задуманное. Например, выставили вы на рабочем столе особенно полюбившиеся вам обои. Пришел кто-то другой, и все поменял… Как решить данную проблему? Конечно, можно просто создать несколько пользователей, но это не самый выгодный вариант. Так как для каждого из них понадобится дополнительные ресурсы. Намного проще решить эту проблему, просто убрав вкладку Desktop (Рабочий стол) из настроек экрана. Для этого зайдите в раздел HKEY_CURRENT_USER\ Software\ Microsoft\ Windows\ CurrentVersion\ Policies и создайте тут новый key с именем System. В этом ключе создайте параметр NoDispBackgroundPage типа DWORD. Присвойте значение 1. Все, теперь никто не изменит ваши обои:-). Чтобы скрыть вкладки Themes (Темы) и Appearance (Оформление), в только что созданном ключе нужно сформировать еще один параметр NoDispAppearancePage того же типа, с тем же значением, что и предыдущий. Теперь вообще никто ничего не поменяет!

    Но и это еще не все. Давайте в этом меню уберем все полностью. Итак, у нас еще осталось две вкладки - это Screen Saver (Заставка) и Setting (Параметры). Для того чтобы спрятать их, нужно создать еще два параметра типа DWORD: NoDispScrSavPage (для скрытия Заставки) и NoDispSettingsPage (для скрытия Параметры). Эти два параметры должны иметь значение 1 (если захотите все вернуть обратно, то выставьте 0).

    Теперь предлагаю немножко поиздеваться над какой-нибудь программкой, которая входит в состав Windows. Например, это будет Media Player. Для этого в разделе HKEY_CURRENT_USER\Software\Policies\Microsoft нужно создать один ключик: WindowsMediaPlayer. Здесь (только уже в правом окошке) создаем параметр TitleBar типа String Value, в значение вписываем название плейера.

    Если уже речь пошла о Media Player, то давайте поэкспериментируем с ним еще. Активизируем его DVD-возможности. Для этого в разделе HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Player\Settings (если такого раздела нет, то сформируйте его самостоятельно) создаем параметр с именем EnableDVDUI и параметром Yes.

    Ну вот мы и поэкспериментировали немного с Windows XP. Конечно, это далеко не все, что можно делать с этой операционной системой с помощью реестра, но для начала хватит.



    Есть вопросы?

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам: