PDA

Показать полную графическую версию : [решено] Переименование веток реестра


Roland1313
22-05-2014, 10:19
Добрый день всем.
Помогите, пожалуйста, решить вот такую задачку.
Есть ветка реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
В ней находятся разделы с именами вида S-1-5-21-191804846-4127745346-670726253-1007 и параметрами внутри этих разделов.
Иногда случаются проблемы, особенно после отключения электричества (это не лечится), когда пользователь не может зайти на сервер.
Тогда и появляются разделы с именами вида S-1-5-21-191804846-4127745346-670726253-1007.bak
Необходимо разделы вида S-1-5-21-191804846-4127745346-670726253-1007 у которых есть "клоны" S-1-5-21-191804846-4127745346-670726253-1007.bak удалить, а
S-1-5-21-191804846-4127745346-670726253-1007.bak переименовать в S-1-5-21-191804846-4127745346-670726253-1007 и во всех переименованных разделах параметрам RefCount и State присвоить значение 0.

Помогите плиз, это случается довольно часто, а профилей несколько сотен. Мучает сильно.

Спасибо.

Iska
22-05-2014, 11:59
Если случается часто — купите ИБП.

Roland1313
22-05-2014, 12:24
Спасибо за совет, конечно-же ИБП есть. Только запас батарей, к сожалению, не бесконечный.

Iska
22-05-2014, 12:43
Смените электрика.

Roland1313
22-05-2014, 18:28
Поверьте, тему с электричеством не решить, это не зависит, ни от электрика, ни от ИБП. Лучше попробовать решить текущую задачу.

Iska
22-05-2014, 23:28
Поверьте и Вы, что нет функции переименования раздела реестра: Registry Functions (Windows) (http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms724875(v=vs.85).aspx). Возможный путь замены — копирование раздела реестра с новым именем и последующее удаление раздела реестра со старым именем.

Ваш подход как к постановке задачи, так к выбору пути её решения — мне лично не интересен. Сожалею, я пас.

Roland1313
23-05-2014, 10:26
Я знаю, что переименование раздела невозможно и надо искать другие пути решения. Я перечитал все, что связано с этим. Мне не хватает знаний и опыта связать воедино несколько скриптов, которые есть на этом форуме. Поэтому и прошу помощи.

Объект, где находится сервер, расположен в 80 км от Кишинева. Деревенская подстанция древняя, как какашки мамонта. Говорить о ее замене не с кем. Поставщик услуг отмахивается и просит больших денег. За постановку задачи простите, пишу как умею. Выбор пути решения - так решения еще нет, из чего выбирать-то? Я, пожалуй, вист.

Anton04
23-05-2014, 12:26
Мне не хватает знаний и опыта связать воедино несколько скриптов, которые есть на этом форуме. »

Ну так предложите на основе чего вы хотите решить Вашу задачу?
А так без заготовок это больно геморно...

Iska
23-05-2014, 13:53
Roland1313, да понятно, что Вам задача ставится «сверху» в виде «шоб було — и точка!».

Roland1313
23-05-2014, 14:51
Примерный алгоритм, как мне кажется, может быть таким:
1. Экспорт в reg-файл ветки реестра
2. Дальше работаем с reg-файлом

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\Test]

[HKEY_LOCAL_MACHINE\SYSTEM\Test\Test1]
"TEst3"="378"

[HKEY_LOCAL_MACHINE\SYSTEM\Test\Test1.bak]
"TEst3"="3"

[HKEY_LOCAL_MACHINE\SYSTEM\Test\Test2]
"Test4"="567"

[HKEY_LOCAL_MACHINE\SYSTEM\Test\Test2.bak]
"Test4"="4"


3. Из reg-файла строки вида [HKEY_LOCAL_MACHINE\SYSTEM\Test\Test2.bak] удаляем. В новый reg-файл (или в конец этого файла) переносим эти строки, но с минусом [-HKEY_LOCAL_MACHINE\SYSTEM\Test\Test2.bak]
4. Т. о. должно получиться что-то
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\Test]

[HKEY_LOCAL_MACHINE\SYSTEM\Test\Test1]
"TEst3"="378"


"TEst3"="3"

[HKEY_LOCAL_MACHINE\SYSTEM\Test\Test2]
"Test4"="567"


"Test4"="4"

[-HKEY_LOCAL_MACHINE\SYSTEM\Test\Test1.bak]
[-HKEY_LOCAL_MACHINE\SYSTEM\Test\Test2.bak]

5. Выполнив отредактированный reg-файл получим то, что надо.

Roland1313
23-05-2014, 17:55
В общем, всем большое спасибо за поддержку и советы. Сделал сам. Алгоритм описан выше.

fName = "test.reg" ' Где текстовый файл

Set FSO = CreateObject("Scripting.FileSystemObject")

Set F = FSO.OpenTextFile(fName,1,False,-2) ' Открываем исходный текст файл для чтения
AllTxt = F.ReadAll() ' Cчитываем весь файл в строковую переменную
F.Close ' Закрываем файл

Mas = Split(AllTxt, vbCr) ' Разбиваем полученную строку в массив. Резделитель - конец строки vbCr

LastTxt = ""
str1 = ".bak" ' подстрока замены
For i = 0 To UBound(Mas)
If UBound(Split(Mas(i), str1))>0 Then 'Если строка содержит ".bak"
LastTxt = LastTxt + Left(Mas(i), 1) + "-" + Right(Mas(i),Len(Mas(i))-1) + vbCrLf ' То будем писать ее в конец файла с "-"
Else AllTxt = AllTxt + Mas(i) + vbCrLf
End If
Next
AllTxt = AllTxt + LastTxt ' Объединяем строки

Set F = FSO.OpenTextFile(fName, 2, True) ' Открываем исходный файл для записи
F.Write AllTxt ' Записываем полученное на место исходного файла
F.Close ' Закрываем файл




© OSzone.net 2001-2012