Компьютерный форум 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=276696)

Menviz 29-01-2014 16:25 2298607

Скрипт для поиска и удаления искомых ключей реестра
 
Всем привет. В интернете нашел скрипт:

Код:

Option Explicit
Dim sSearchFor, st, st0, sRegTmp, sOutTmp, eRegLine, iCnt, sRegKey, aRegFileLines, stroca, isDel, delLine, delLines, resbox
Dim wssh : Set wssh = CreateObject("WScript.Shell")
Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject")

sSearchFor = InputBox("Введите в поле искомое слово." &vbcrlf&vbcrlf& "Задавая искомую фразу, будьте осторожны: Убедитесь в уникальности имени удаляемого параметра...", "Реестр | fate (modified by Lucky)")
If sSearchFor = "" Then Cleanup()
 
Dim StartTime : StartTime = Timer
 
sRegTmp = wssh.Environment("Process")("Temp") & "\RegTmp.tmp "
sOutTmp="RegDel "&sSearchFor&".txt"

wssh.Run "regedit /e /a " & sRegTmp, , True
aRegFileLines = Split(FSO.GetFile(sRegTmp).OpenAsTextStream(1, 0).Read(FSO.GetFile(sRegTmp).Size), vbcrlf) 'делим текст данных на строки
FSO.DeleteFile(sRegTmp)

Dim txt : Set txt = fso.OpenTextFile(sOutTmp,2,True)
txt.WriteLine "<fate (modified by Lucky) | Реестр>"
txt.WriteLine "<Ниже перечислены найденные ветки>"&vbcrlf&"<Вы можете удалить здесь те строки, которые хотели бы оставить в реестре...>"

For Each eRegLine in aRegFileLines
On Error Resume Next
  If InStr(1, eRegLine, "[", 1) > 0 Then        'проверяем: это раздел (если есть [) или параметр.
    sRegKey = eRegLine
  end if
  If InStr(1, eRegLine, sSearchFor, 1) >  0 Then 'если в строке найдено искомая фраза, работаем с ней:
    If sRegKey <> eRegLine Then
      st0=Split(eRegLine,"=")          'делим пераметр на то что левее "=" (имя) и правее "=" (значение)
      st=Replace(st0(0),"""","")        'берем лишь имя параметра для построения пути
      stroca=Mid(sRegKey,2)
      stroca=Replace (stroca,"]","",1)  'исключяем знаки ] из строки Раздела
      txt.WriteLine stroca &"\"& st    'запись строки в обрабатываемый файл
    else
      stroca=Mid(sRegKey,2)
      stroca=Replace (stroca,"]"," ",1)
      stroca =Trim(stroca)
      txt.WriteLine stroca & "\"        'запись строки в обрабатываемый файл
    End If
    iCnt = iCnt + 1
  End If
Next

txt.Close
Erase aRegFileLines
 
If iCnt < 1 Then
  wssh.Popup "Поиск длился  " & FormatNumber(Timer - StartTime, 0) & " сек. " & _
            "По запросу " & chr(34) & sSearchFor & chr(34) & _
            " ничего не найдено.",, "Реестр | fate (modified by Lucky)", 4096
  FSO.DeleteFile(sOutTmp)
  Cleanup()
End If
 
wssh.Popup "Поиск длился " & FormatNumber(Timer - StartTime, 0) & " сек. " & _
          iCnt & " совпадений по запросу " & chr(34) & sSearchFor & chr(34),, _
          "Реестр | fate (modified by Lucky)", 4096
 
wssh.Run "NotePad " & sOutTmp, 3, True 'открытие NotePad с отчётом об удалении

delLines = Split(FSO.OpenTextFile(sOutTmp,1).ReadAll, vbcrlf)
For Each delLine in delLines
  if Left(delLine,1)<>"<" then
  Err.Clear
  wssh.RegDelete delLine                  'удаление строки в реестре
  If Err.Number<>0 then
      Err.Clear : wssh.RegRead delLine
      if Err.Number=0 then
        resbox=resbox&delLine&vbCrLf&vbCrLf
      end if
  End if
  end if
Next
if resbox<>"" then resbox="Следующие строки удалить не удалось:"&vbCrLf&resbox

isDel=wssh.Popup(resbox&"Хотите сохранить файл отчета удаляемых строк?",, _
                "Отчёт | fate (modified by Lucky)", 36)
if isDel=7 then FSO.DeleteFile(sOutTmp)
Cleanup()
 
Sub Cleanup()
  Set wssh = Nothing
  Set FSO = Nothing
  WScript.Quit
End Sub

Со следующим функционалом:
1. Запрос искомой фразы для поиска.
2. Вывод результатов в окне Блокнота с возможностью исключения параметров по желанию пользователя.
3. Сохранение файла отчёта в текущей директории по выбору пользователя.

Всё вроде бы нормально, скрипт отрабатывает






но....
Почему он не удаляет ветки?!
Скрипт запускаю под учеткой админа.
В vbs плохо разбираюсь. Хэлп

Iska 29-01-2014 16:28 2298611

Например, прав не хватает. Вы проверяли разрешения на перечисленные разделы реестра?

Menviz 29-01-2014 16:42 2298622

Iska, права есть. если я запускаю regedit под этой же учеткой, то могу удалить ветки

Iska 29-01-2014 17:01 2298638

Тогда, возможно, удаляемый раздел не пуст — внутри него есть другие разделы.

Menviz 30-01-2014 08:55 2299007

Iska, Да, всё верно. Скрипт не удаляет с подразделами. Можно ли как-то это исправить?

Iska 30-01-2014 09:02 2299008

Можно. Рекурсией. Используя Wbem и объект «StdRegProv».

Menviz 30-01-2014 10:49 2299057

Iska, Мда. Еще бы знать как это организовать в коде.

Iska 30-01-2014 10:52 2299059

Так: vbscript stdregprov registry key recursive delete - Поиск в Google. Первой же ссылкой в выдаче.


Время: 15:24.

Время: 15:24.
© OSzone.net 2001-