Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Как найти и изменить параметр реестра не зная где он находится

Ответить
Настройки темы
VBS/WSH/JS - [решено] Как найти и изменить параметр реестра не зная где он находится

Пользователь


Сообщения: 61
Благодарности: 7

Профиль | Отправить PM | Цитировать


Изменения
Автор: krot183
Дата: 09-02-2014
Всем привет!
Помогите кто может.Нужно найти параметр реестра в ветке HKLM не зная полного пути к нему и создать переменную с полным путём к этому параметру.В пути к параметру есть {SID} который меняется при переустановке Windows и на каждом компьютере он тоже разный.Нашёл несколько скриптов в интернете. "Скрипт 1" - не работает с REG_BINARY но с SZ и DWORD работает. "Скрипт 2" - работает с BINARY но не знаю как написать поиск пути к параметру и создание переменной. Пытался объединить оба скрипта не вышло.

Скрипт 1
Код: Выделить весь код
Option Explicit

Dim SectionName
Dim tmpRegFile
Dim FindValue
Dim AddValue
Dim objWSS
Dim objFSO
Dim RegFile
Dim CurrSection
Dim GetLine
Dim KeyName
Dim strPrompt
Dim ReturnValue

SectionName = "HKEY_CURRENT_USER\Software"
tmpRegFile  = "z:\tmp.reg"
FindValue   = "Строка поиска"
AddValue    = "Строка замены"

Set objWSS = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

objWSS.Run "regedit /e " & tmpRegFile & " """ & SectionName & """", 2, True

Set RegFile = objFSO.OpenTextFile(tmpRegFile, 1, True, -1)

Do While RegFile.AtEndOfStream <> True
  GetLine = RegFile.ReadLine
  If Left(GetLine, 6) = "[HKEY_" Then
    CurrSection = Mid(GetLine, 2, Len(GetLine) - 2)
  Else
    If InStr(GetLine, FindValue) Then
      strPrompt = "Вы желаете заменить значение ключа " & GetLine & vbNewLine & _
                  "в разделе " & CurrSection & vbNewLine & _
                  "на значение """ & AddValue & """?"
      ReturnValue = MsgBox(strPrompt, 35, "Замена в реестре")
      If ReturnValue = 6 Then
        KeyName = Replace(Split(GetLine, "=")(0), """", "")        
        If KeyName = "@" Then KeyName = "" 
        objWSS.RegWrite CurrSection & "\" & KeyName, AddValue, "REG_SZ"
      ElseIf ReturnValue = 2 Then
        Exit Do
      End If
    End If
  End If
Loop

RegFile.Close

'Следующая строка закомментирована для возможности отката изменений
'objFSO.DeleteFile tmpRegFile   

Set objWSS = Nothing
Set objFSO = Nothing

MsgBox "Скрипт завершил работу"

WScript.Quit
Скрипт 2
Код: Выделить весь код
const HKEY_LOCAL_MACHINE = &H80000002
FindValue   = "{4b361010-def7-43a1-a5dc-071d955b62f7},15"
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{75a38608-57f5-412d-a267-62e7cce381c1}\FxProperties"
AddValue = Array(&H41,&H00,&Hf8,&H73,&H01,&H00,&H00,&H00,&Hfc,&Hff,&Hff,&Hff,&Hf8,&Hff,&Hff,&Hff,&Hf6,&Hff,&Hff,&Hff,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&Hfa,&Hff,&Hff,&Hff,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00)

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

oReg.SetBinaryValue HKEY_LOCAL_MACHINE,strKeyPath, "{4b361010-def7-43a1-a5dc-071d955b62f7},15",AddValue

Отправлено: 15:55, 09-02-2014

 

Пользователь


Сообщения: 61
Благодарности: 7

Профиль | Отправить PM | Цитировать


Значения параметров "{4b361010-def7-43a1-a5dc-071d955b62f7},14"
"{4b361010-def7-43a1-a5dc-071d955b62f7},15"
"{4b361010-def7-43a1-a5dc-071d955b62f7},16"

Если это просто поиск я могу убрать вывод сообщения из этого скрипта и объединить со вторым скриптом из шапки чтобы менялись значения в параметрах?

Отправлено: 09:00, 17-02-2014 | #21



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

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


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Разве Вы говорили что-либо про изменение параметров? Вы писали:
Цитата krot183:
Нужно найти параметр реестра в ветке HKLM не зная полного пути к нему и создать переменную с полным путём к этому параметру. »
Полный путь к параметру будет в переменной «strResult». Или не будет.

Так Вам что на самом деле нужно сделать?

Отправлено: 09:08, 17-02-2014 | #22


Пользователь


Сообщения: 61
Благодарности: 7

Профиль | Отправить PM | Цитировать


Iska, Изменить значения в параметрах.Спасибо.Я вроде понял как это сделать. Прийду с работы попробую и отпишусь.

Отправлено: 09:11, 17-02-2014 | #23


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата krot183:
Изменить значения в параметрах. »
1. В каких именно параметрах?
2. На что именно изменить?

Отправлено: 09:27, 17-02-2014 | #24


Пользователь


Сообщения: 61
Благодарности: 7

Профиль | Отправить PM | Цитировать


Iska, Вот что и на что надо изменить
Код: Выделить весь код
"{4b361010-def7-43a1-a5dc-071d955b62f7},14"=dword:00000001

"{4b361010-def7-43a1-a5dc-071d955b62f7},16"=hex:41,00,f8,73,01,00,00,00,00,00,\
  00,00,f4,01,00,00,f4,01,00,00,f4,01,00,00,00,00,00,00,f4,01,00,00,f4,01,00,\
  00,4a,01,00,00,4a,01,00,00

"{4b361010-def7-43a1-a5dc-071d955b62f7},15"=hex:41,00,f8,73,01,00,00,00,fc,ff,\
  ff,ff,f8,ff,ff,ff,f6,ff,ff,ff,00,00,00,00,00,00,00,00,fa,ff,ff,ff,00,00,00,\
  00,00,00,00,00
Не вышло у меня изменить параметры

Отправлено: 10:32, 17-02-2014 | #25


Пользователь


Сообщения: 61
Благодарности: 7

Профиль | Отправить PM | Цитировать


Iska, Огромное спасибо! Всё получилось.Вот что у меня вышло
Код: Выделить весь код
Option Explicit

Const HKEY_LOCAL_MACHINE = &H80000002

Dim strComputer
Dim strKey
Dim arrParameters

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim arrSubKeys
Dim strSubKey

Dim objRegExp

Dim arrParameter
Dim lngValue
Dim arrValues
Dim boolFound
Dim strResult

Dim AddValue1
Dim AddValue2
Dim AddValue3
Dim FindValue1
Dim FindValue2
Dim FindValue3


strComputer   = "."
strKey        = "SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render"
FindValue1    = "{4b361010-def7-43a1-a5dc-071d955b62f7},14"
FindValue2    = "{4b361010-def7-43a1-a5dc-071d955b62f7},15"
FindValue3    = "{4b361010-def7-43a1-a5dc-071d955b62f7},16"
AddValue1     = 1
AddValue2     = Array(&H41,&H00,&Hf8,&H73,&H01,&H00,&H00,&H00,&Hfc,&Hff,&Hff,&Hff,&Hf8,&Hff,&Hff,&Hff,&Hf6,&Hff,&Hff,&Hff,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&Hfa,&Hff,&Hff,&Hff,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00)
AddValue3     = Array(&H41,&H00,&Hf8,&H73,&H01,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&Hf4,&H01,&H00,&H00,&Hf4,&H01,&H00,&H00,&Hf4,&H01,&H00,&H00,&H00,&H00,&H00,&H00,&Hf4,&H01,&H00,&H00,&Hf4,&H01,&H00,&H00,&H4a,&H01,&H00,&H00,&H4a,&H01,&H00,&H00)
arrParameters = Array( _
	Array("{4b361010-def7-43a1-a5dc-071d955b62f7},14", "DWORD"), _
	Array("{4b361010-def7-43a1-a5dc-071d955b62f7},15", "BINARY"), _
	Array("{4b361010-def7-43a1-a5dc-071d955b62f7},16", "BINARY") _
)


Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\default")
Set objSWbemObjectEx   = objSWbemServicesEx.Get("StdRegProv")

If objSWbemObjectEx.EnumKey(HKEY_LOCAL_MACHINE, strKey, arrSubKeys) = 0 Then
	If Not IsNull(arrSubKeys) Then
		Set objRegExp = WScript.CreateObject("VBScript.RegExp")
		objRegExp.Pattern = "^\{[\da-fA-F]{8}(?:-[\da-fA-F]{4}){3}-[\da-fA-F]{12}}$"
		
		For Each strSubKey In arrSubKeys
			If objRegExp.Test(strSubKey) Then
				boolFound = True
				
				For Each arrParameter In arrParameters
					Select Case arrParameter(1)
						Case "DWORD"
							If objSWbemObjectEx.GetDWORDValue(HKEY_LOCAL_MACHINE, strKey & "\" & strSubKey & "\FxProperties", arrParameter(0), lngValue) <> 0 Then
								boolFound = False
							End If
						Case "BINARY"
							If objSWbemObjectEx.GetBinaryValue(HKEY_LOCAL_MACHINE, strKey & "\" & strSubKey & "\FxProperties", arrParameter(0), arrValues) <> 0 Then
								boolFound = False
							End If
						Case Else
							' Not implemented
					End Select
				Next
				
				If boolFound Then
					strResult = "HKLM\" & strKey & "\" & strSubKey
					
					Exit For
				End If
			End If
		Next
		
		Set objRegExp = Nothing
		
		If Not boolFound Then
			WScript.Echo "Can't find any right subkey in [HKLM\" & strKey & "]."
			WScript.Quit 3
		End If
	Else
		WScript.Echo "Nothing found in [HKLM\" & strKey & "]."
		WScript.Quit 2
	End If
Else
	WScript.Echo "Not found subkey [HKLM\" & strKey & "]."
	WScript.Quit 1
End If

objSWbemObjectEx.SetDWORDValue HKEY_LOCAL_MACHINE, strKey & "\" & strSubKey & "\FxProperties", FindValue1, AddValue1
objSWbemObjectEx.SetBinaryValue HKEY_LOCAL_MACHINE, strKey & "\" & strSubKey & "\FxProperties", FindValue2, AddValue2
objSWbemObjectEx.SetBinaryValue HKEY_LOCAL_MACHINE, strKey & "\" & strSubKey & "\FxProperties", FindValue3, AddValue3

Set objSWbemObjectEx   = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

Отправлено: 11:11, 17-02-2014 | #26


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Вообще-то вот так:
Код: Выделить весь код
Option Explicit

Const HKEY_LOCAL_MACHINE = &H80000002

Dim strComputer
Dim strKey
Dim arrParameters

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim arrSubKeys
Dim strSubKey

Dim objRegExp

Dim arrParameter
Dim lngValue
Dim arrValues
Dim boolFound
Dim strResult


strComputer   = "."
strKey        = "SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render"
arrParameters = Array( _
	Array("{4b361010-def7-43a1-a5dc-071d955b62f7},14", "DWORD", 1), _
	Array("{4b361010-def7-43a1-a5dc-071d955b62f7},15", "BINARY", Array(&H41,&H00,&Hf8,&H73,&H01,&H00,&H00,&H00,&Hfc,&Hff,&Hff,&Hff,&Hf8,&Hff,&Hff,&Hff,&Hf6,&Hff,&Hff,&Hff,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&Hfa,&Hff,&Hff,&Hff,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00)), _
	Array("{4b361010-def7-43a1-a5dc-071d955b62f7},16", "BINARY", Array(&H41,&H00,&Hf8,&H73,&H01,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&Hf4,&H01,&H00,&H00,&Hf4,&H01,&H00,&H00,&Hf4,&H01,&H00,&H00,&H00,&H00,&H00,&H00,&Hf4,&H01,&H00,&H00,&Hf4,&H01,&H00,&H00,&H4a,&H01,&H00,&H00,&H4a,&H01,&H00,&H00)) _
)


Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\default")
Set objSWbemObjectEx   = objSWbemServicesEx.Get("StdRegProv")

If objSWbemObjectEx.EnumKey(HKEY_LOCAL_MACHINE, strKey, arrSubKeys) = 0 Then
	If Not IsNull(arrSubKeys) Then
		Set objRegExp = WScript.CreateObject("VBScript.RegExp")
		objRegExp.Pattern = "^\{[\da-fA-F]{8}(?:-[\da-fA-F]{4}){3}-[\da-fA-F]{12}}$"
		
		For Each strSubKey In arrSubKeys
			If objRegExp.Test(strSubKey) Then
				boolFound = True
				
				For Each arrParameter In arrParameters
					Select Case arrParameter(1)
						Case "DWORD"
							If objSWbemObjectEx.GetDWORDValue(HKEY_LOCAL_MACHINE, strKey & "\" & strSubKey & "\FxProperties", arrParameter(0), lngValue) <> 0 Then
								boolFound = False
							End If
						Case "BINARY"
							If objSWbemObjectEx.GetBinaryValue(HKEY_LOCAL_MACHINE, strKey & "\" & strSubKey & "\FxProperties", arrParameter(0), arrValues) <> 0 Then
								boolFound = False
							End If
						Case Else
							' Not implemented
					End Select
				Next
				
				If boolFound Then
					For Each arrParameter In arrParameters
						Select Case arrParameter(1)
							Case "DWORD"
								If objSWbemObjectEx.SetDWORDValue(HKEY_LOCAL_MACHINE, strKey & "\" & strSubKey & "\FxProperties", arrParameter(0), arrParameter(2)) <> 0 Then
									WScript.Echo "Can't set DWord Value into parameter [HKLM\" & strKey & "\" & strSubKey & "\FxProperties" & "\" & arrParameter(0) & "]."
								End If
							Case "BINARY"
								If objSWbemObjectEx.SetBinaryValue(HKEY_LOCAL_MACHINE, strKey & "\" & strSubKey & "\FxProperties", arrParameter(0), arrParameter(2)) <> 0 Then
									WScript.Echo "Can't set Binary Value into parameter [HKLM\" & strKey & "\" & strSubKey & "\FxProperties" & "\" & arrParameter(0) & "]."
								End If
							Case Else
								' Not implemented
						End Select
					Next
					
					Exit For
				End If
			End If
		Next
		
		Set objRegExp = Nothing
		
		If Not boolFound Then
			WScript.Echo "Can't find any right subkey in [HKLM\" & strKey & "]."
			WScript.Quit 3
		End If
	Else
		WScript.Echo "Nothing found in [HKLM\" & strKey & "]."
		WScript.Quit 2
	End If
Else
	WScript.Echo "Not found subkey [HKLM\" & strKey & "]."
	WScript.Quit 1
End If

Set objSWbemObjectEx   = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:42, 18-02-2014 | #27


Пользователь


Сообщения: 61
Благодарности: 7

Профиль | Отправить PM | Цитировать


Iska, Спасибо работает.

Отправлено: 08:52, 18-02-2014 | #28


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


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



Код: Выделить весь код
Option Explicit

Dim SectionName
Dim tmpRegFile
Dim FindValue
Dim AddValue
Dim objWSS
Dim objFSO
Dim RegFile
Dim CurrSection
Dim GetLine
Dim KeyName
Dim strPrompt
Dim ReturnValue

SectionName = "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook"
tmpRegFile  = "d:\tmp.reg"
FindValue   = "YYY.XXX.ru"
AddValue    = "ZZZ.XXX.ru"

Set objWSS = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

objWSS.Run "regedit /e " & tmpRegFile & " """ & SectionName & """", 2, True

Set RegFile = objFSO.OpenTextFile(tmpRegFile, 1, True, -1)

Do While RegFile.AtEndOfStream <> True
  GetLine = RegFile.ReadLine
  If Left(GetLine, 6) = "[HKEY_" Then
    CurrSection = Mid(GetLine, 2, Len(GetLine) - 2)
  Else
    If InStr(GetLine, FindValue) Then
      strPrompt = "Вы желаете заменить значение ключа " & GetLine & vbNewLine & _
                  "в разделе " & CurrSection & vbNewLine & _
                  "на значение """ & AddValue & """?"
      ReturnValue = MsgBox(strPrompt, 35, "Замена в реестре")
      If ReturnValue = 6 Then
        KeyName = Replace(Split(GetLine, "=")(0), """", "")        
        If KeyName = "@" Then KeyName = "" 
        objWSS.RegWrite CurrSection & "\" & KeyName, AddValue, "REG_SZ"
      ElseIf ReturnValue = 2 Then
        Exit Do
      End If
       objWSS.RegWrite CurrSection & "\" & KeyName, AddValue, "REG_SZ"   
    End If
  End If
Loop

RegFile.Close

'Следующая строка закомментирована для возможности отката изменений
'objFSO.DeleteFile tmpRegFile   

Set objWSS = Nothing
Set objFSO = Nothing
'MsgBox "Скрипт завершил работу"

WScript.Quit

Отправлено: 12:36, 06-05-2016 | #29



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Как найти и изменить параметр реестра не зная где он находится

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как найти, где находится @c.atdmt.com C181UMZ Лечение систем от вредоносных программ 1 29-07-2013 23:36
CMD/BAT - [решено] Найти в реестре параметр и записать в переменную имя ветки в которой он находится root221 Скриптовые языки администрирования Windows 11 25-11-2012 07:54
V. 2007 - Сервер Microsoft Exchange как изменить имя, где оно находится. vladimirz Microsoft Exchange Server 7 22-07-2010 20:19
как удалить ключ реестра если он не хочет oIo_DeN_oIo Microsoft Windows 2000/XP 10 23-12-2006 02:25




 
Переход