Что нового

[Реестр] Добавление параметра в реестр по маске

sufx

Новичок
Сообщения
9
Репутация
0
Версия AutoIt: 3.3.12.0

Описание: Добрый вечер.
Ув. форумчане, подскажите есть ли возможность заменить уникальный идентификатор на некую маску в пути реестра к параметру?
Пример: есть вот такой путь

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002

В "каталоге" 00000002 есть некий параметр который нужно добавить.
Как я понимаю длинный цифробуквенный набор перед 00000002 это и есть уникальный идентификатор, вот его то и нужно как-то заМАСКировать :smile:, чтобы добавление патаметра выглядело следующим образом :


[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\"МАСКА"\00000002]
"SMTP Use Auth"=dword:00000001

Примечания: нашел вот такой скрипт, но он про удаление значения, может его можно взять за основу.
Код:
; опции
$search='=='

$kol=StringLen($search)
$found=''

; запускаем цикл поиска всех подразделов указанного раздела реестра
$i=0
While 1
    $i+=1
    $key = RegEnumKey("HKLM\SOFTWARE\Classes\CLSID", $i)
    If @error then ExitLoop
        ; запускаем вложенный цикл поиска всех параметров найденного раздела реестра
        $j=0
        While 1
            $j+=1
            $Valuename = RegEnumVal('HKLM\SOFTWARE\Classes\CLSID\'&$key, $j)
            If @error then ExitLoop
            $Value = RegRead('HKLM\SOFTWARE\Classes\CLSID\'&$key, $Valuename)
            If StringRight($Value, $kol)=$search Then
                ;здесь описываем, что будем делать с тем что нашли (удалять или составить список и показать)
                $found&='HKLM\SOFTWARE\Classes\CLSID\'&$key&@TAB&$Valuename&@CRLF ;объединяем в список для просмотра
                ; RegDelete('HKLM\SOFTWARE\Classes\CLSID\'&$key, $Valuename) ; тут удаляем сразу, но не рекомендуется без просмотра
            EndIf
        WEnd
WEnd

If $found = '' Then
    MsgBox(0, 'Сообщение', 'Ничего не найдено')
    Exit
EndIf

$found=StringTrimRight($found, 2) ;удаляем последний @CRLF состоящий из двух символов

; показываем найденное в виде таблицы
$list=StringSplit($found, @CRLF, 1)
Dim $Key_Val[$list[0]+1][2]
For $i = 1 to $list[0]
    $tmp=StringSplit($list[$i], @TAB)
    If $tmp[0] = 2 Then
        $Key_Val[$i][0]=$tmp[1]
        $Key_Val[$i][1]=$tmp[2]
    EndIf
Next
#include <Array.au3>
_ArrayDisplay($Key_Val, 'Найденное')

; предлагаем удалить найденные параметры
If MsgBox(4+256, 'Сообщение', 'Удалить список найденных параметров?')=6 Then
    For $i = 1 to $list[0]
        RegDelete($Key_Val[$i][0], $Key_Val[$i][1])
    Next
EndIf

Используйте для AutoIt кода тег [autoit]
autoit.gif

madmasles.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
sufx

Код:
$KEY='HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook'
$MASKA='9375CFF0413111d3B88A00104B2A6676'

RegWrite($KEY&'\'&$MASKA&'\00000002','SMTP Use Auth','REG_DWORD',1)
 
Автор
S

sufx

Новичок
Сообщения
9
Репутация
0
Я возможно неправильно изложил суть, или Вы меня недопоняли.
добавить этот ( "SMTP Use Auth"=dword:00000001) параметр нужно в "папку" 00000002, эта папка есть только в одной из подпапок с уникальным идентификатором.
Нужно найти эту "папочку" 00000002 в одной из подпапок с уникальным идентификатором, и если такая папка найдена то в неё уже добавить вышеуказанный параметр.
Уникальный идентификатор не известен.
как-то так :stars:
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
sufx

Код:
$KEY='HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook'

 $COUNTER=1

 While True
  $K=RegEnumKey($KEY,$COUNTER)
  If @error Then ExitLoop
  RegRead($KEY&'\'&$K&'\00000002','')
  If @Error=-1 Then RegWrite($KEY&'\'&$K&'\00000002','SMTP Use Auth','REG_DWORD',1)
  $COUNTER+=1
 WEnd
 
Автор
S

sufx

Новичок
Сообщения
9
Репутация
0
Спасибо огромное!
А можешь еще подсказать, как изменить скрипт, для того чтоб он искал в ветке реестра HKEY_CURRENT_USER\Software\Microsoft параметр SMTP Use Auth и изменял его значение на 1.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
sufx

Код:
$KEY='HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook'

 $COUNTER1=1

 While True
  $K1=RegEnumKey($KEY,$COUNTER1)
  If @error Then ExitLoop
  $COUNTER2=1
  While True
   $K2=RegEnumKey($KEY&'\'&$K1,$COUNTER2)
   If @error Then ExitLoop
   If RegRead($KEY&'\'&$K1&'\'&$K2,'SMTP Use Auth')<>'' Then
    RegWrite($KEY&'\'&$K1&'\'&$K2,'SMTP Use Auth','REG_DWORD',1)
   EndIf
   $COUNTER2+=1
  WEnd
  $COUNTER1+=1
 WEnd
 
Автор
S

sufx

Новичок
Сообщения
9
Репутация
0
Можешь описать код? чтоб я врубился.
Просто нужно поправить чтоб он искал по всем подкаталогам HKCU\Software\Microsoft а не только в HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
sufx
Если начинать от Microsoft, то получается не два уровня вложенности, а несколько больше, поэтому алгоритм будет другой, рекурсивный, то есть, нужно будет создавать функцию, которая будет вызывать сама себя...
В предложенном выше скрипте, всего два уровня вложенности проверяется, начиная от Outlook, для этого рекурсию использовать не обязательно...
То есть, я пробегаю все подветки Outlook и проверяю во вложенном цикле все подветки подветки, а в каждой из них ищу нужный параметр SMTP Use Auth...
 
Автор
S

sufx

Новичок
Сообщения
9
Репутация
0
Понятно, спасибо за помощь!!!


Добавлено:
Сообщение автоматически объединено:

Чутка не работает. а есть параметр или функция (не знаю как назвать правильно) обратная @error
я хочу поменять немного код вот так
$K2=RegEnumKey($KEY&'\'&$K1,$COUNTER2)
If @error Then ExitLoop
RegRead($KEY&'\'&$K1&'\'&$K2,'SMTP Server')
if @не ошибка Then RegWrite($KEY&'\'&$K1&'\'&$K2,'SMTP Use Auth','REG_DWORD',1)



Добавлено:
Сообщение автоматически объединено:

Отбой, сам допер до @error=0 :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
sufx,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Верх