Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Удаление значения реестра по типу (http://forum.oszone.net/showthread.php?t=334197)

Darkysha 07-04-2018 15:52 2807592

Удаление значения реестра по типу
 
Вложений: 1
Всем привет

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

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

Iska 07-04-2018 16:02 2807594

Цитата:

Цитата Darkysha
определить по этому пути все регедиты »

Чего-чего определить?

Darkysha 07-04-2018 18:24 2807612

Iska, регедит=параметр реестра, так принято называть, он же рег, оно же "параметр".

Iska 07-04-2018 19:50 2807635

Цитата:

Цитата Darkysha
Iska, регедит=параметр реестра, так принято называть, »

Darkysha, впервые об этом «так принято» слышу.

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

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

PowerShell
Код:

$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 2807644

RTFM!
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 2807646

Цитата:

Цитата x0r
Перечисли нужные тебе имена параметров »

x0r, полагаю, вопрос состоит именно в определении перечня этих имён ;).

Казбек 07-04-2018 20:46 2807653

Цитата:

Цитата Darkysha
регедит=параметр реестра, так принято называть, он же рег, оно же "параметр". »

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

x0r 08-04-2018 00:48 2807683

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

Iska 08-04-2018 07:05 2807695

Цитата:

Цитата x0r
Iska, ну ты предложил динамит. Шарахнем всех! »

Я предложил?!!

DJ Mogarych 08-04-2018 20:16 2807791

Определить-то несложно:
Код:

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

Busla 08-04-2018 23:42 2807813

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 2807814

Цитата:

Цитата DJ Mogarych
В Пауэршелле Get-ItemProperty выдаёт кое-что, но типа ключей от него добиться невозможно. В интернете есть разные костыли, реализующие функционал определения типа ключей, но как передать данные для команды удаления - лично я так и не понял. »

Код, который я привёл выше, с условием по типу, пусть и причёсанный мною — код в основе своей именно из интернета. Удалять параметры так:
Код:

Remove-ItemProperty -Path 'Registry::HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' -Name $_.Name


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

Darkysha 09-04-2018 16:06 2807898

x0r, спасибо, это для меня подходит наиболее. Не знал что так можно.


Время: 16:58.

Время: 16:58.
© OSzone.net 2001-