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

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

Lightman123 16-08-2011 11:36 1732943

.bat: удаление значения реестра после отбора
 
Добрый день!
Весь день в гугле, но поскольку сам далек от программирования, то ничего толком не получается.
Помогите, пожалуйста, решить непосильную задачу:

Есть такой раздел в реестре: HKLM\System\CurrentControlSet\Enum\USB, куда сохраняются любые устройства при присоединении к ПК через USB.
В данном разделе при присоединении устройства создаются подразделы (назовем их для удобства подразделы 1), содержащие в названии Vid и Pid устройств, например:
HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544
HKLM\System\CurrentControlSet\Enum\USB\Vid_03f0&Pid_3b17
и т.д.

В свою очередь, в этих подразделах (1) создаются еще подразделы (2), содержащие в названии SN устройств, например:
HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544\0765432567654
HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544\2131231233231
и т.д.

В подразделах (2) есть параметр типа REG_SZ, который называется Service. Он содержит информацию о том, что за устройство было подключено.
Например, если он равен USBSTOR, то была подключена флешка.
===================================
Теперь сама задача, которую я устал решать вручную:
Нужно удалить с ПК все флешки.
Необходимо, чтобы умный bat-файл проверял каталог HKLM\System\CurrentControlSet\Enum\USB на содержимое файлов Service (которые лежат в подразделах (2), причем имена подразделов (1) и (2) у всех устройств разные), а потом удалял нужный подраздел (1),
например:
Флешка была HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544\0765432567654 (параметр Service=USBSTOR), значит нужно удалить подраздел HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544.

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

Я так понимаю, что нужен предварительный поиск и сохранение пути для удаления в какую-то переменную, причем это должно быть в цикле, но сколько с интернета всего скачал - ничего не получается собрать вместе.
Заранее огромное спасибо, господа скриптеры :) .

Lightman123 16-08-2011 11:48 1732952

Нашел такое:

@echo off

set sKey=HKCU\Software\Microsoft\Internet Explorer\TypedURLs
for /f "delims= " %%i in ('reg.exe query "%sKey%" ^| find /i "www.microsoft.com"') do (reg.exe delete "%sKey%" /v "%%i" /f >nul)

Почти подходит, надо только чтобы удалял не просто параметр, а еще и 2 подраздела выше.
И искал на 2 раздела ниже, не зная их названий.

MadMaks 16-08-2011 11:53 1732957

Lightman123, не совсем в тему, но...
Есть замечательная утилита USBDeview которая отображает все USB девайсы в системе, а так же может удалять их следы

Lightman123 16-08-2011 11:58 1732964

Да, я знаю, спасибо, но USBDeview удаляет только из USB, причем только из CurrentControlSet, а при присоединении флешки следы остаются более чем в 15 ветках реестра.
Хочу все засунуть в 1 bat файл для ускорения процесса.

MadMaks 16-08-2011 12:24 1732988

Цитата:

Цитата Lightman123
следы остаются более чем в 15 ветках реестра. »

хоть 30 веток в разделе HKEY_LOCAL_MACHINE\SYSTEM\ будет,
а используются только 2
указанные в ключах
HKEY_LOCAL_MACHINE\SYSTEM\Select
Current и LastKnownGood
все остальные висят вхолостую и не используются

Lightman123 16-08-2011 12:28 1732989

Да, я это знаю, спасибо.
Я говорю это к тому, что даже если взять только каталог CurrentControlSet, то в нем факт подключения флешки остается более чем в 15 ветках!
USB, USBSTOR, RemovableMedia, DeviceClasses, USBFlags и т.д.

Большую часть из них я уже объединил в 1 файл, но там все просто - удаляется целиком раздел, потом новый создается.
А вот с USB затык - тут нужен предварительный отбор.

Помогите, пожалуйста, со скриптом :)

Iska 16-08-2011 12:47 1733007

Цитата:

Цитата Lightman123
то в нем факт подключения флешки остается более чем в 15 ветках! »

И что?

Какова конечная цель? Вам надо предотвратить использование новых и уже ранее подключённых флэшек? Или Вы пытаетесь следы использования зачистить?

Lightman123 16-08-2011 12:50 1733010

Зачистить следы. Устал это делать вручную в реестре + USBDeview.
Большая часть веток уже добавлена в bat-файл, а вот с этой возник затык...

SendMessage 16-08-2011 15:07 1733115

Код:

@echo off

setlocal enabledelayedexpansion

set "Section=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"

for /f "tokens=*" %%a in ('reg query %Section% /s ^| findstr "%Section%\\Vid_ USBSTOR"') do (
  if "%%a"=="Service        REG_SZ        USBSTOR" (if "!ps:~0,4!"=="Vid_" echo reg delete "%Section%\!ps!" /f >> usbstor.txt)
  set "ps=!s!"&set "s=%%~na"
)

То, что выделено красным, нужно убрать. Но я настоятельно советую прежде запустить в нынешнем виде и проверить в реестре правильность скрипта.

Lightman123 16-08-2011 15:32 1733129

Огромное спасибо! Работает!

Lightman123 17-08-2011 08:53 1733520

Не могу этот скрипт оптимизировать под последнюю задачу:

Ветка реестра HKLM\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-44455340000}
Здесь куча подразделов с именами 0000, 0001, 0002, 0003, ...
В этих подразделах есть параметр DriverDesc, у которого могут быть разные значения.
Нужно удалить все подразделы 0000, 0001, 0002, 0003, ..., в которых параметр DriverDesc=Запоминающее устройство для USB

Помогите, пожалуйста.
Пытался исправить скрипт SendMessage - ничего не получилось, не могу понять, где указать, что проверять не на 2 уровня ниже, а на 1, и проблема с русским содержимым параметра DriverDesc.

Заранее спасибо огромное!

Lightman123 17-08-2011 10:02 1733556

Вот сам сделал такое, но в конце он вместо названия подраздела вставляет InfSection REG_SZ USBSTOR_BULK
Почему он это делает понятно, но как сюда вместо этого добавить название подраздела - не понимаю.

setlocal enabledelayedexpansion
set "Section=HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}"
for /f "tokens=*" %%a in ('reg query %Section% /s ^| findstr /rc:^USBSTOR_BULK$') do (
if "%%a"=="InfSection REG_SZ USBSTOR_BULK" (echo reg delete %Section%\%%a /f >> 1.txt)

Foreigner 17-08-2011 10:26 1733565

Цитата:

Цитата Lightman123
как сюда вместо этого добавить название подраздела »

Так?
Код:

@echo off
setlocal

set "section=hklm\system\controlset001\control\class\{36FC9E60-C465-11CF-8056-444553540000}"

for /f "tokens=3" %%i in ('reg query "%section%" /v "infsection"') do (

    if /i "%%i"=="USBSTOR_BULK"  reg delete "%section%" /v "infsection" /f

)


Lightman123 17-08-2011 10:40 1733576

Почему-то не работает...
Может я неправильно объяснил мысль - название подразделов мне неизвестны, т.е. я не могу в вашем скрипте в infsection дописать что-то от себя.
Подраздел может быть любой из диапазона 0000-NNNN

Lightman123 17-08-2011 11:33 1733630

Не понимаю почему отличается вывод двух кодов:

setlocal enabledelayedexpansion
set "Section=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"
for /f "tokens=*" %%a in ('reg query %Section% /s ^| findstr "%Section%\\Vid_ USBSTOR"') do (echo >> 1.txt)

setlocal enabledelayedexpansion
set "Section=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-44455340000}"
for /f "tokens=*" %%a in ('reg query %Section% /s ^| findstr "%Section%\\00 USBSTOR"') do (echo >> 1.txt)

В первом случае выдает ЦЕЛИКОМ пути, а во втором - список [имя_файла тип значение].
Уже взрыв мозга случился, помогите, пожалуйста, со скриптом.

Мне кажется, что проблема в {} во втором случае, но как ее решить - не могу понять.
Точно, проблема в фигурных скобках.

Foreigner 17-08-2011 12:31 1733678

Lightman123,
Если честно ничего не понял. Удалить все USBSTORE?
Попробуй так:
Код:

@echo off
setlocal

set "regroot=HKLM\System\CurrentControlSet\Enum\USB"

for /f "tokens=*" %%i in ('reg query "%regroot%" /v Service /s') do call:del "%%i"
goto:eof

:del
0>nul set /p="%~1" | 1>nul findstr /b "HKEY.*" && set "regpath=%~1" || set "param=%~1"

for /f "tokens=3" %%i in ("%param%") do if /i "%%i"=="USBSTOR" (

    echo reg delete "%regpath%" /v Service /f

)


Lightman123 17-08-2011 12:36 1733685

Извините, если запутал, косноязычен :) .

Еще раз повторю свою проблему:

Ветка реестра HKLM\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-44455340000}
Здесь куча подразделов с именами 0000, 0001, 0002, 0003, ...
В этих подразделах (практически в каждом) есть параметр InfSection, у которого могут быть разные значения.
Нужно удалить все подразделы 0000, 0001, 0002, 0003, ..., в которых параметр InfSection=USBSTOR_BULK.

Сейчас попробую ваш скрипт переделать.

Foreigner 17-08-2011 13:00 1733700

Код:

@echo off
setlocal

for /f "tokens=*" %%i in ('reg query "hklm\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}" /v InfSection /s') do call:del "%%i"
goto:eof

:del
0>nul set /p="%~1" | 1>nul findstr /b "HKEY.*" && set "regpath=%~1" || set "param=%~1"

for /f "tokens=3" %%i in ("%param%") do if /i "%%i"=="USBSTOR_BULK" (

    echo reg delete "%regpath%" /v InfSection /f
    set "regpath="
    set "param="

)

PS. Не знаю сработает или нет reg delete.

Lightman123 17-08-2011 13:05 1733703

Спасибо!

Только не запускается - ругается, что слишком много параметров в командной строке.
Как мне кажется, ругается на /v и /s в одной строке.

Foreigner 17-08-2011 13:13 1733714

Lightman123,
Пример выше, последний, все отработал как положено (без удаления, только вывел на экран через echo)

Lightman123 17-08-2011 13:25 1733721

Я его целиком скопировал в пустой bat-файл и запустил. Сразу закрывается. Если открыть через cmd, то выдает ошибку про слишком много параметров.
Может дело в версии reg.exe?
У меня если смотреть через reg query 3.0, ОС WinXP.

Foreigner 17-08-2011 13:28 1733724

посмотри reg query /?
Есть ли там параметр /s

SendMessage 17-08-2011 13:28 1733727

Можно и так:
Код:

@echo off

set "Section=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-44455340000}"

for /f "tokens=*" %%a in ('reg query "%Section%" ^| findstr /c:"HKEY_LOCAL_MACHINE"') do (
  reg query "%%a" /s | find "USBSTOR_BULK" && if not "%%a"=="%Section%" echo reg delete "%%a" /f >> USBSTOR_BULK.txt
)

Только надо проверять имя секции внимательно - у меня другое, например - {36FC9E60-C465-11CF-8056-444553540000}

Lightman123 17-08-2011 13:41 1733741

Второй вариант сработал, огромное вам спасибо!

Foreigner 17-08-2011 13:43 1733746

Цитата:

Цитата SendMessage
reg query "%Section%" »

У меня reg query отказался работать с фигурными кавычками в переменной, только напрямую. Экранирование не помогло.

SendMessage 17-08-2011 13:54 1733755

Цитата:

Цитата Foreigner
У меня reg query отказался работать с фигурными кавычками в переменной, только напрямую »

У меня работает, вроде. А вот findstr отказался. Почему и пришлось выборку делать более общую.

Цитата:

Цитата Lightman123
Второй вариант сработал, огромное вам спасибо! »

Кстати, его лучше использовать и для первой задачи - более правильный скрипт. Не сразу до кондиции его прокрутил.
Код:

@echo off

set "Section=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"

for /f "tokens=*" %%a in ('reg query "%Section%" ^| findstr /c:"%Section%\\Vid_"') do (
  reg query "%%a" /s | find "USBSTOR" && echo reg delete "%%a" /f >> USBSTOR.txt
)



Время: 13:30.

Время: 13:30.
© OSzone.net 2001-