Войти

Показать полную графическую версию : Удаление значения реестра по типу


Darkysha
07-04-2018, 15:52
Всем привет

Есть путь: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
В нем есть много параметров, внесенных вручную(см. скриншот - синие), нужно с помощью батника определить по этому пути все регедиты и удалить их если в них выставлен тип REG_DWORD

У самого не хватает опыта и понимания CMD скриптинга на такое. Заранее огромное спасибо!

Iska
07-04-2018, 16:02
определить по этому пути все регедиты »
Чего-чего определить?

Darkysha
07-04-2018, 18:24
Iska, регедит=параметр реестра, так принято называть, он же рег, оно же "параметр".

Iska
07-04-2018, 19:50
Iska, регедит=параметр реестра, так принято называть, »
Darkysha, впервые об этом «так принято» слышу.

Пакетные файлы — не лучший способ, удобнее и проще использовать WSH/PoSH. Определить можно так:
Option Explicit

Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_DWORD = 4


Dim strKeyPath

Dim arrValueNames, arrValueTypes

Dim i
Dim lngValue


strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\default").Get("StdRegProv")
If .EnumValues(HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes) = 0 Then
For i = LBound(arrValueNames) To UBound(arrValueNames)
If arrValueTypes(i) = REG_DWORD Then
If .GetDWORDValue(HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames(i), lngValue) = 0 Then
WScript.Echo "0x" & Right(String(8, "0") & Hex(lngValue), 8), arrValueNames(i)
Else
WScript.Echo "An error occured when reading value of [HKEY_LOCAL_MACHINE\" & strKeyPath & "\" & arrValueNames(i) & "]."
End If
End If
Next
Else
WScript.Echo "An error occured when reading [HKEY_LOCAL_MACHINE\" & strKeyPath & "]."
WScript.Quit 1
End If
End With

WScript.Quit 0
$RegKey = Get-ItemProperty 'Registry::HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'

$RegKey.PSObject.Properties | ForEach-Object -Process {
if($_.TypeNameOfValue -eq 'System.Int32') {
"0x{0:X8}`t{1, -30}" -f $_.Value, $_.Name
}
}
По поводу же «всё синее есть внесённое вручную и потому подлежит удалению» — ну, не знаю, не знаю. Сделать-то можно, но нужно ли?!

x0r
07-04-2018, 20:12
RTFM! (https://support.microsoft.com/ru-ru/help/310516/how-to-add-modify-or-delete-registry-subkeys-and-values-by-using-a-reg)
Reg-файлы могут как добавлять , так и удалять значения и ключи в реестре Виндовс. Для удаления надобно всего-то добавить знак "-" (минус) после "="
Перечисли нужные тебе имена параметров в точно такомже REG-файле, только заместо парамтров повтыкай - и точно также вноси\удаляй нужные тебе значения\разделы. Никаких доп. скриптов не нужно.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
"DeadGWDetectDefault"=-
"DontAddDefaultGatewayDefault"=-
"EnableWsd"=-
"QualifyingDestinationThreshold"=-
"TcpWindowSize"=-
... ну и т.д.

Iska
07-04-2018, 20:32
Перечисли нужные тебе имена параметров »
x0r, полагаю, вопрос состоит именно в определении перечня этих имён ;).

Казбек
07-04-2018, 20:46
регедит=параметр реестра, так принято называть, он же рег, оно же "параметр". »

Ну, может это так принято у бабушек на скамейке. А у Майкрософт есть официальная терминология, которую на русском языке прекрасно изложил (http://www.outsidethebox.ms/10408/#term) Вадим в своей статье.

x0r
08-04-2018, 00:48
Iska, ну ты предложил динамит. Шарахнем всех! Что в общем то, явл. точным ответом на вопрос TS. Да.
Я предложил точечные поражения, конкретных целей. Точно известных, явных, с минимальным отклонением.
Пущай выбираит :)

Iska
08-04-2018, 07:05
Iska, ну ты предложил динамит. Шарахнем всех! »
Я предложил?!!

DJ Mogarych
08-04-2018, 20:16
Определить-то несложно:
reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /t REG_DWORD
Только выдаваемый результат - не объекты, и с ними ничего не сделаешь. В Пауэршелле Get-ItemProperty выдаёт кое-что, но типа ключей от него добиться невозможно. В интернете есть разные костыли, реализующие функционал определения типа ключей, но как передать данные для команды удаления - лично я так и не понял.

Busla
08-04-2018, 23:42
DJ Mogarych, Iska

Get-Item ($hive="HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters") | Select-Object -ExpandProperty Property | Where-Object { (Get-Item $hive).GetValueKind($_.ToString()) -eq "DWord"} | ForEach-Object { Remove-ItemProperty $hive -Name $_.ToString() }

Iska
08-04-2018, 23:43
В Пауэршелле Get-ItemProperty выдаёт кое-что, но типа ключей от него добиться невозможно. В интернете есть разные костыли, реализующие функционал определения типа ключей, но как передать данные для команды удаления - лично я так и не понял. »
Код, который я привёл выше (http://forum.oszone.net/post-2807635.html#post2807635), с условием по типу, пусть и причёсанный мною — код в основе своей именно из интернета. Удалять параметры так:
Remove-ItemProperty -Path 'Registry::HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' -Name $_.Name

Update: Busla, по сути — «те же яйца, токмо в профиль»™. Но за .GetValueKind() — спасибо, этого я не дочитал, так, конечно удобнее.

Darkysha
09-04-2018, 16:06
x0r, спасибо, это для меня подходит наиболее. Не знал что так можно.




© OSzone.net 2001-2012