1

Тема: VBS: Скрипт который будет удалять или править ветку реестра

Добрый день форумчане и разработчики скриптов!
Обращаюсь к Вам за помощью.
Есть необходимость написать скрипт который будет удалять все ветки реестра по адресу
HKEY_USERS\%Profile%\Software\1C\1Cv7\7.7\Titles
где %Profile% - определяется скриптом для всех пользователей данного компьютера

В этой ветке несколько строковых значений
к примеру
Параметр \\192.168.0.14\Base1\
Значение Документооборот
Параметр \\192.168.0.14\Base2\
Значение Делопроизводство

А затем по этим адресам будет записывать новые строковые значения или только одно.
Параметр \\192.168.0.124\Base\
Значение Делопроизводство+Документооборот

Необходимо для автоматизации чистки реестра и прописания нового пути к базе данных 1С.

2

Re: VBS: Скрипт который будет удалять или править ветку реестра

Ivan_Kinomanov, если есть домен, то самый простой вариант — пакетный файл, делающий импорт *.reg файлов, например:

@echo off
start /min /wait regedit /s "\\domain.com\Goodies$\1Cv7.7 Buh 2010.reg"
start /min /wait regedit /s "\\domain.com\Goodies$\1Cv7.7 ZiK 2010.reg"

Располагаем его в сценариях входа в групповой политике соответствующего OU:

Политика Установка ссылок на базы 1С-Предприятие [dc.domain.com]
   Конфигурация компьютера    
   Конфигурация пользователя    
      Конфигурация программ    
      Конфигурация Windows    
         Службы удаленной установки    
         Сценарии (вход/выход из системы)    <===
         Параметры безопасности    
         Перенаправление папки    
         Настройка Internet Explorer    
      Административные шаблоны

Примерное содержимое *.reg файла:

Windows Registry Editor Version 5.00

; Удалить подраздел вместе со всеми предыдущими параметрами:
[-HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles]

; Если же нужно убрать не все, а только какие-то конкретные, заранее известные параметры, тогда так:
[HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles]
"\\\\SQL\\Бухгалтерия 2009\\"=-

; Добавляем нужные параметры:
[HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles]
"\\\\SQL\\Бухгалтерия 2010\\"="Бухгалтерия 2010"

3

Re: VBS: Скрипт который будет удалять или править ветку реестра

Отлично!!! По моему это то что нужно.

4

Re: VBS: Скрипт который будет удалять или править ветку реестра

А как это сделать при помощи сценария VBS?

5

Re: VBS: Скрипт который будет удалять или править ветку реестра

Для результата не критично каким инструментом пользоваться. Вам какая разница?

6

Re: VBS: Скрипт который будет удалять или править ветку реестра

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

7

Re: VBS: Скрипт который будет удалять или править ветку реестра

В WSH нет красивой оболочки.

Описывайте подробно и в конкретностях, что Вы хотите.

8 (изменено: Rom5, 2012-03-09 23:00:04)

Re: VBS: Скрипт который будет удалять или править ветку реестра

Gera-sim пишет:

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

На "Главной" есть описание работы на VBS с реестром - чтение/запись/удаление - см Рецепты WMI: работа с реестром Windows, и даже примеры работы, в т.ч. и рекурсивного чтения веток. Взяв этот пример за образец, я сделал еще и так сказать недостающее в описании - рекурсивное удаление. Т.е. команда удаления ключа, может удалить только ключ, в котором нет подключей, иначе приходится это делать рекурсивно.

Я его реализовал так:

'--- Запуск рекурсивного удаления всех веток раздела реестра'
' pPC - имя машины, с реестром которой работаем
' pROOT - одна из констант : Const HKLM = &H80000002 / Const HKEY_USERS = &H80000003
' pKeyPath - путь к разделу
Function uf_recursDelSubkeys(pPC, pROOT, pKeyPath)
	retDel = 0 ' накапливаем возвращаемые коды ошибок - для определения успешности удаления в целом'
	retDel = uf_DeleteSubkeys (pPC, pROOT, pKeyPath)
	uf_recursDelSubkeys = retDel
End FUNCTION
Function uf_DeleteSubkeys (pPC, pROOT, pKeyPath)
	retDel = 0
	Set objRegistry = GetObject("winmgmts:\\" & pPC & "\root\default:StdRegProv")
	objRegistry.EnumKey pROOT, pKeyPath, arrSubkeys 
	If IsArray(arrSubkeys) Then 
		For Each strSubkey In arrSubkeys
			retDel = retDel + uf_DeleteSubkeys (pPC, pROOT, pKeyPath & "\" & strSubkey)
		Next 
	End If 
	ret = objRegistry.DeleteKey (pROOT, pKeyPath)
	retDel = retDel + ret
	Set objRegistry = Nothing
	uf_DeleteSubkeys = retDel
End FUNCTION

О самой программе, использующей такое удаление, рассказывал в ветке - HTA/CMD: Инструмент редактирования реестра удаленной системы. Может она Вам подойдет в качестве "красивой" оболочки. Если попробуете ее и решите, что не хватает какого-то функционала, то дайте знать - скрипт у меня так сказать "не заброшен", могу чего и дописать. Это приложение для случаев, если Вы хотите вносить изменения в чьем-то удаленном реестре. А если надо всего лишь "красиво" подтверждать изменения в своем реестре - пишите скрипт по примерам из "Главной" и перемежевывайте его диалогами подтверждения  - MsgBox().

А я в свою очередь поинтересуюсь у коллег - есть ли какие-то идеи по реализации переименования существующего ключа реестра, кроме создания ключа с новым именем и рекурсивного копирования в него содержимого ключа со старым именем и далее с последующим удалением старой ветки ?

WBR. Roman

9 (изменено: Gera-sim, 2012-03-10 00:05:23)

Re: VBS: Скрипт который будет удалять или править ветку реестра

Спасибо за исчерпывающий ответ!
В принципе я к этому и сам начал приходить, но этот пример действительно не только функционален, но и очень КРАСИВ!!!

10

Re: VBS: Скрипт который будет удалять или править ветку реестра

Rom5 пишет:

А я в свою очередь поинтересуюсь у коллег - есть ли какие-то идеи по реализации переименования существующего ключа реестра, кроме создания ключа с новым именем и рекурсивного копирования в него содержимого ключа со старым именем и далее с последующим удалением старой ветки ?

Идей нет, кроме как экспортировать раздел реестра в файл, сделать замену RegExp'ом, добавить туда же удаление раздела, импортировать файл в реестр — что, в принципе, означает то же самое. Насколько я помню, в WinAPI нет функций по переименованию разделов и параметров реестра.