powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поиск реестра Windows
11 сообщений из 11, страница 1 из 1
Поиск реестра Windows
    #38653321
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моё почтение всем форумчанам!

Не подскажите как программно искать реестр Windows если известно название ключа, но заранее неизвестно точное расположение ветки реестра?
Я имею ввиду возможен ли поиск с использованием подстановочных символов или что-то наподобие этого?

Thanks in advance!
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38653362
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenвозможен ли поиск с использованием подстановочных символов или что-то наподобие этого?Нет такого.
Энумеруй ветки и перебирай в поисках нужного ключа. Заодно обдумай, как будешь выворачиваться от одноимённых ключей (всяко ж бывает...).
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38654753
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создал вот такую программку (можно использовать как в VBA, так и в VB скрипт).
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
Function GetHive(RegPath)
    Select Case Left(RegPath, InStr(1, RegPath, "\") - 1)
    Case "HKEY_CLASSES_ROOT"
        GetHive -2147483648#
    Case "HKEY_CURRENT_USER"
        GetHive = -2147483647
    Case "HKEY_LOCAL_MACHINE"
        GetHive = -2147483646
    Case "HKEY_USERS"
        GetHive = -2147483645
    Case "HKEY_CURRENT_CONFIG"
        GetHive = -2147483643
    End Select
End Function

Sub GetAllSubKeys(ByRef strRegPath, ByRef arrSubKeys, ByVal strComputer)
' В параметре процедуры "strRegPath" необходимо указать полностью раздел Windows реестра.
' Например так: "HKEY_CURRENT_USER\Software".
Dim oWMI, Hive, strPath
On Error Resume Next
If Len(strComputer) = 0 Then strComputer = "."
Hive = GetHive(strRegPath)
If Hive = 0 Then
    MsgBox "Указан неверный Windows реестр """ & strRegPath & """!", vbExclamation + vbSystemModal
    Exit Sub
End If
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\default:StdRegProv")
strPath = Mid(strRegPath, InStr(1, strRegPath, "\") + 1)
oWMI.EnumKey Hive, strPath, arrSubKeys
If IsNull(arrSubKeys) Then
    arrSubKeys = Split("", ";")
    MsgBox "Ветка """ & strRegPath & """ либо не существует, либо не имеет подразделов!", vbExclamation + vbSystemModal
End If
End Sub

Sub GetAllKeyValues(ByRef strRegPath, ByRef arrValueNames, ByRef arrValueTypes, ByVal strComputer)
Dim oWMI, Hive, strPath, i
Const REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const REG_BINARY = 3
Const REG_DWORD = 4
Const REG_MULTI_SZ = 7
On Error Resume Next
If Len(strComputer) = 0 Then strComputer = "."
Hive = GetHive(strRegPath)
If Hive = 0 Then
    MsgBox "Указан неверный Windows реестр """ & strRegPath & """!", vbExclamation + vbSystemModal
    Exit Sub
End If
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\default:StdRegProv")
strPath = Mid(strRegPath, InStr(1, strRegPath, "\") + 1)
oWMI.EnumValues Hive, strPath, arrValueNames, arrValueTypes
If IsNull(arrValueNames) Then
    arrValueNames = Split("", ";")
    arrValueTypes = Split("", ";")
    MsgBox "Ветка """ & strRegPath & """ либо не существует, либо не имеет ключей.", _
        vbExclamation + vbSystemModal
Else
    strPath = ""
    For i = 0 To UBound(arrValueNames)
        Select Case arrValueTypes(i)
        Case REG_SZ
            strPath = strPath & ";String"
        Case REG_EXPAND_SZ
            strPath = strPath & ";Expanded String"
        Case REG_BINARY
            strPath = strPath & ";Binary"
        Case REG_DWORD
            strPath = strPath & ";DWORD"
        Case REG_MULTI_SZ
            strPath = strPath & ";Multi String"
        End Select
    Next
    strPath = Mid(strPath, 2)
    arrValueTypes = Split(strPath, ";")
End If
End Sub


Если не ошибаюсь, то в WMI как-то можно фильтровать. Вот примерчик (правда случай совсем другой):
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38654763
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Set WMI = GetObject("winmgmts:\\.")
Set Objs = WMI.ExecQuery("SELECT * FROM Win32_Process WHERE NAME LIKE '%access%'")
For Each Obj In Objs
    If Len(Obj.CommandLine) > 0 Then
        strCommandLine = strCommandLine & vbCrLf & Obj.CommandLine
    End If
Next



Может и здесь как-то можно применить фильтр?
Никто не сталкивался с подобной задачкой?
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38655030
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenМожет и здесь как-то можно применить фильтр?Где и что ещё нужно фильтровать-то?
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38655225
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaГде и что ещё нужно фильтровать-то?
Да я всё о том же. Знаю название ключа, скажем "sandboxmode", но заранее не знаю в какой ветке находится этот ключ, т.к. в разных машинах ОС и офис могут быть абсолютно разными! Надо найти везде и присвоить значение 0. Как то так.

P.S. Случаи когда у пользователя нет прав на изменение реестров можно не взять в расчёт, в таких случаях админ будет разруливать (конечно не плохо было бы решить и такую проблему, но я не хакер, для меня это не критично).
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38655427
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot studieren]AkinaЗнаю название ключа, скажем "sandboxmode", но заранее не знаю в какой ветке находится этот ключ, т.к. в разных машинах ОС и офис могут быть абсолютно разными! Надо найти везде и присвоить значение 0. Как то так.
Это ерунда.
А теперь представь, что у некоего стороннего приложения есть такой ключ. И что его обнуление делает из него (а ещё хуже - из хранящихся в нём критичных данных) мелкий фарш... и ты своими руками организуешь этот локальный армагеддончик... чем расплачиваться-то будешь?

Если это ключ Офиса - то изволь штатно определить ветку реестра именно Офиса (вернее, всех установленных на станции Офисов - они могут присутствовать и использоваться параллельно и даже одновременно!), и именно в нужном месте (а оно строго определено!) менять именно требуемый ключ. Да, это придётся покопать техдоки чуть дальше обложки, куда деваться...
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38655574
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina...Если это ключ Офиса - то изволь штатно определить ветку реестра именно Офиса (вернее, всех установленных на станции Офисов - они могут присутствовать и использоваться параллельно и даже одновременно!), и именно в нужном месте (а оно строго определено!) менять именно требуемый ключ. Да, это придётся покопать техдоки чуть дальше обложки, куда деваться...
Это как? Например, если у Вас Win XP и офис 97, то ветка выглядит так:
HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\3.5\engines
Если офис 2000, 2002, 2003, то тогда так
HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\engines
Если у Вас офис 2007:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines
Офис 2010:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines

Если у Вас Win 7:
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines

Это далеко не весь перечень. Ещё раз повторяю, ОС могут быть абсолютно разными (XP, Vista, 7, 8 и т.д.), офис тоже (2000, 2002, 2003, 2007, 2010, 2013 и т.д.). Microsoft к сожалению из версии к версии меняет как ему вздумается. А без изменения данного ключа в MS Access не выключается режим "песочница" и не работает многие встроенные функции / процедуры VBA.
Я хочу при запуске программы найти значения "sandboxmode" в любом ОС и в любом офисе и подправить. Как быть?
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38655782
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studieren,

Определить битность системы, ОС, версию офиса и сгенерировать путь.
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38656114
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidystudieren,

Определить битность системы, ОС, версию офиса и сгенерировать путь.
Завтра появится новая ОС и/или новый офис, ну и переделать программу заново соответствующим образом. :)
...
Рейтинг: 0 / 0
Поиск реестра Windows
    #38656380
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studiereniMrTidystudieren,

Определить битность системы, ОС, версию офиса и сгенерировать путь.
Завтра появится новая ОС и/или новый офис, ну и переделать программу заново соответствующим образом. :)

Понятно, Вы хотите написать код на века, не самая удачная идея. Программы - продукт скоропортящийся.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поиск реестра Windows
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]