[CMD] Чтение веток реестра у пользователей и выгрузка данных в CSV формат

bboymig

Новый пользователь
Сообщения
16
Реакции
1
Добрый день! Есть небольшая задача. Необходимо выгрузить данные из реестра у каждого пользователя на рабочей станции.

CMD/BATCH:
@echo on
for /F "tokens=2*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /s /v "ProfileImagePath"^|findstr /rc:"^[ ][ ]*"^|findstr /v /c:"LocalService" /c:"NetworkService"') do set profiles=%%j
    ECHO %profiles% >> %systemdrive%\user.csv
    REG load HKEY_USERS\Custom "%profiles%\NTUSER.DAT"
    REG Query "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant" /s >> %systemdrive%\user.csv
    REG Query "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /s >> %systemdrive%\user.csv
    REG unload HKEY_USERS\Custom
    )
pause
exit

Не могу понять как исправить bat файл, чтобы bat прошелся по всем NTUSER.DAT .
И как можно сформировать данные, чтобы выгрузка была в таком формате?
CMD/BATCH:
echo HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant
echo %profiles%; %name% ; %type% ; value%;
echo HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
echo %profiles%; %name% ; %type% ; value%;
Спасибо.
 
Не могу понять как исправить bat файл, чтобы bat прошелся по всем NTUSER.DAT .
Почти правильно, только открывающейся скобки в конце for не хватает, и значение %profiles% там получить нельзя, только через !profiles! либо call.

CMD/BATCH:
@echo off
SetLocal EnableExtensions

set log=%systemdrive%\user.csv

del "%log%" 2>NUL

for /F "tokens=2*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /s /v "ProfileImagePath" ^| find /i "Users"') do (
  set profiles=%%j
  call :mount
)
pause
goto :eof

:mount
  echo %profiles% >> "%log%"
  REG load HKEY_USERS\Custom "%profiles%\NTUSER.DAT"
  REG Query "HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant" /s >> "%log%"
  REG Query "HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /s >> "%log%"
  REG unload HKEY_USERS\Custom
exit /b

Только, если пользователь уже залогинился, вы не сможете подмонтировать файл его улья. Вместо этого необходимо читать уже смонтированные ульи из HKEY_USERS\S-1-5-21-*

И как можно сформировать данные, чтобы выгрузка была в таком формате?
Я не понимаю, что это за формат. Можете привести реальный пример, а не код?
 
@Чугуев, совершенно верно.
Результат работы должен быть таким.
CMD/BATCH:
HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
C:\Users\Admin;C:\Users\Admin\AppData\Local\Microsoft\OneDrive\19.002.0107.0005\FileSyncConfig.exe;REG_BINARY;5341435001000000000000000700000028000000308104009156050001000000000000000000000A00210000631F6E6F0EDED4010000000100000000;
C:\Users\vasya;C:\Users\vasya\AppData\Local\Microsoft\OneDrive\Update\OneDriveSetup.exe;REG_BINARY;534143500100000000000000070000002800000078D8160264B9170201000000000000000000000A00210000631F6E6F0EDED4010000000100000000;
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted
C:\Users\vasya;C:\Program Files (x86)\Ubisoft\Ubisoft Game Launcher\upc.exe;REG_DWORD;0x20;
C:\Users\Admin;C:\Users\Admin\Downloads\Hisuite_10.1.0.550_OVE\Hisuite_10.1.0.550_OVE\Setup.exe;REG_DWORD;0x1;
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
C:\Users\vasya;D:\Games\SN30pro+SF30pro_Firmware_V1.33\8Bitdo_Update.exe;REG_SZ;$ WinBlueRTM;
C:\Users\vasya;D:\Games\Enemy Infestation\Enemy Infestation\Enemy Infestation (1998)\Ei.exe;REG_SZ;DWM8And16BitMitigation;
C:\Users\vasya;F:\GOG Games\UBOAT\UBOAT.exe;REG_SZ;HIGHDPIAWARE;

@Dragokas, Сейчас тот вариант что Вы предложили работает некорректно.
Выгружает не всю информацию от пользователя Admin.
CMD/BATCH:
C:\WINDOWS\system32>REG load HKEY_USERS\Custom "C:\Users\Admin\NTUSER.DAT"
Операция успешно завершена.
C:\WINDOWS\system32>REG Query "HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant" /s  1>>"C:\user.csv"
Ошибка: Не удается найти указанный раздел или параметр в реестре.
C:\WINDOWS\system32>REG Query "HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /s  1>>"C:\user.csv"
Ошибка: Не удается найти указанный раздел или параметр в реестре.
C:\WINDOWS\system32>REG unload HKEY_USERS\Custom
Операция успешно завершена.

А мой Bat файл выгружает данные в два раза больше:
CMD/BATCH:
C:\WINDOWS\system32>ECHO C:\Users\Admin  1>>C:\user.csv
C:\WINDOWS\system32>REG load HKEY_USERS\Custom "C:\Users\Admin\NTUSER.DAT"
Операция успешно завершена.
C:\WINDOWS\system32>REG Query "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant" /s  1>>C:\user.csv
C:\WINDOWS\system32>REG Query "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /s  1>>C:\user.csv
C:\WINDOWS\system32>REG unload HKEY_USERS\Custom
Операция успешно завершена.

В чем может быть причина?

Только, если пользователь уже залогинился, вы не сможете подмонтировать файл его улья. Вместо этого необходимо читать уже смонтированные ульи из HKEY_USERS\S-1-5-21-*
Как решить данную задачу? Проверять доступность файла NTUSER.DAT?

У уважаемого Nir Sofer есть программа, но она показывает не все ветки и нельзя удаленно выгрузить все данные от всех пользователей:
https://www.nirsoft.net/utils/app_compatibility_view.html
Bat файл удаленно запускаю от имени SYSTEM.
А мне необходимы все ветки, всех пользователей. Это необходимо для анализа и поиска первичных индикаторов компроментации в системе.
 
@Dragokas, Сейчас тот вариант что Вы предложили работает некорректно.
Выгружает не всю информацию от пользователя Admin.
Поторопился с выводами. Данные почему то выгружались у меня под текущим пользователем. У Вас все корректно.
 
А мой Bat файл выгружает данные в два раза больше:
То, что он выгружает в два раза больше, не означает, что он работает правильно, а мой некорректно.
Посмотрите на строку
Код:
REG Query "HKEY_CURRENT_USER ...
вашего кода.
Вы всегда выгружаете данные из ветки текущего пользователя, а не того, которого смонтировали.
Смонтированный находится по адресу HKEY_USERS\Custom\...

Ошибка: Не удается найти указанный раздел или параметр в реестре.
Означает, что у смонтированной ветки (пользователя) просто отсутствует данный ключ вообще, следовательно и нет никаких данных для эскпорта.

Как решить данную задачу? Проверять доступность файла NTUSER.DAT?
При чём тут файл. Так и решить. Перечислить все ключи HKEY_USERS\S-1-5-21-* и оттуда экспортировать нужные вам ключи.
Если нужно найти соответствие с именем пользователя, то вся информация есть в HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
 
CMD/BATCH:
@echo on
SetLocal EnableExtensions

set log=%systemdrive%\user.csv

del "%log%" 2>NUL

echo %USERPROFILE% >> "%log%"
REG Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant" /s >> "%log%"
REG Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /s >> "%log%"

for /F "tokens=2*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /s /v "ProfileImagePath" ^| find /i "Users"') do (
  set profiles=%%j
  call :mount
)
pause
goto :eof

:mount
  echo %profiles% >> "%log%"
  REG load HKEY_USERS\Custom "%profiles%\NTUSER.DAT"
  REG Query "HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant" /s >> "%log%"
  REG Query "HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /s >> "%log%"
  REG unload HKEY_USERS\Custom

setlocal ENABLEDELAYEDEXPANSION
for /F %%r in ('reg query hku') do (
    set key=%%r
    if "!key:~11,8!"=="S-1-5-21" if NOT "!key:~-8!"=="_Classes" (
        REG Query "!key!\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant" /s >> "%log%"
        REG Query "!key!\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /s >> "%log%"
    )
)
endlocal
exit /b

@Dragokas, спасибо за помощь! Прощу прощения за невнимательность. Это было неправильно и некорректно с моей стороны. Сейчас огромное желание поскорее решить данную задачу.

Такого кода для чтения будет достаточно, чтобы прочитать все данные для всех пользователей. Или я что-то упускаю?
Можно ли данную выгрузку привести в вид формата csv с разделителями ";"?
Когда наименование параметров известно, это легко, а вот когда они разные, не знаю как сделать.

Как пример, чтение данных для Криптопро:
CMD/BATCH:
For /F "Tokens=2*" %%I In ('Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties" /V ProductID') Do Set ProductID=%%J
For /F "Tokens=2*" %%I In ('Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties" /V DisplayVersion') Do Set DisplayVersion=%%J
For /F "Tokens=2*" %%I In ('Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties" /V InstallDate') Do Set InstallDate=%%J
echo %computername%;%ProductID%;%DisplayVersion%;%InstallDate%;%date%;>>%startup_folder%\Crypto.csv
Сделать такую же структуру у файла.
 
Последнее редактирование:
Та ещё задачка.
У Batch нет возможности делать такой форматный вывод.
Попробую на VBS сделать форматирование.
 
ExtractLayers.cmd

CMD/BATCH:
@echo off
SetLocal EnableExtensions

set log=%~dp0user.csv

del "%log%" 2>NUL

:: Экспорт глобального улья (HKLM)
echo [HKLM]
set "profiles=Global"
call :LogHive "HKLM"

:: Экспорт из уже смонтированных ульев (залогиненных пользователей)
for /F %%r in ('reg query hku ^| find /i "S-1-5-21-" ^| find /v /i "Classes"') do (
  for /f "tokens=2 delims=\" %%a in ("%%~r") do (
    echo.
    rem Извлечение пути к профилю
    for /f "tokens=2*" %%b in (
      'reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%%~a" /v "ProfileImagePath" ^| find /i "ProfileImagePath"'
    ) do echo [HKU] %%c& set "profiles=%%c"
  )
  call :LogHive "%%~r"
)

:: Монтирование файла улья из папок каждого из пользователей (которые не залогинены; для залогиненных будет получен отказ в доступе)
for /F "tokens=2*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /s /v "ProfileImagePath" ^| find /i "Users"') do (
  set profiles=%%j
  call :mount
)
echo.
pause
goto :eof

:mount [HiveFile]
  echo.
  echo [HIV] %profiles%
  REG unload HKEY_USERS\Custom 2>NUL
  set /p "=[M+] "<NUL
  REG load HKEY_USERS\Custom "%profiles%\NTUSER.DAT" || exit /b 1
  call :LogHive "HKEY_USERS\Custom"
  set /p "=[M-] "<NUL
  REG unload HKEY_USERS\Custom
  timeout /t 1 >NUL
exit /b 0

:LogHive [prefix]
  set /p "=[KEY.1] "<NUL
  call :EnumKey "%~1\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant"
  set /p "=[KEY.2] "<NUL
  call :EnumKey "%~1\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
exit /b

:EnumKey [key]
  REG Query "%~1" >NUL && (
    echo [OK]
    cscript.exe //nologo "%~dp0EnumKey.vbs" "%log%" "%profiles%" "%~1"
  )
exit /b

EnumKey.vbs

VB.NET / VBA:
'Option Explicit

Const HKEY_CLASSES_ROOT    = &H80000000
Const HKEY_CURRENT_USER    = &H80000001
Const HKEY_LOCAL_MACHINE    = &H80000002
Const HKEY_USERS            = &H80000003
Const HKEY_CURRENT_CONFIG    = &H80000005

Const REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const REG_BINARY = 3
Const REG_DWORD = 4
Const REG_MULTI_SZ = 7
Const REG_QWORD = 11

Const FILE_APPEND_MODE = 8

Set WshShell = CreateObject("WScript.Shell")
Set reg = GetObject("winmgmts://./root/default:StdRegProv")
Set fso = CreateObject("Scripting.FileSystemObject")

hive = 0

sLog = WScript.Arguments(0)
Profile = WScript.Arguments(1)
strKeyPath = WSCript.Arguments(2)

Set ts = fso.OpenTextFile(sLog, FILE_APPEND_MODE, true)

NormalizeKeyNameAndHiveHandle hive, strKeyPath

EnumerateKeys hive, strKeyPath

ts.Close

Sub EnumerateKeys(hive, key)
  On Error Resume Next

  LogKey GetHiveNameByHandle(hive) & "\" & key
 
  reg.EnumValues hive, key, arrNames, arrTypes
 
  If Not IsNull(arrNames) Then
    for i = 0 to Ubound(arrNames)
      name = arrNames(i)
      iType = arrTypes(i)
      if name <> "" and IsNumeric(iType) then
        LogValue name & ";" & GetKeyTypeName(iType) & ";" & ReadParam(hive, key, name, iType)
      end if
    next
  end if
 
  reg.EnumKey hive, key, arrSubKeys
 
  If Not IsNull(arrSubKeys) Then
    For Each subkey In arrSubKeys
      EnumerateKeys hive, key & "\" & subkey
    Next
  End If
End Sub

Function ReadParam(hive, key, name, iType)
  Dim value
  Select Case iType
  case REG_SZ:            reg.GetStringValue hive, key, name, value
  case REG_EXPAND_SZ:     value = WshShell.RegRead(GetHiveNameByHandle(hive) & "\" & key & "\" & name)
  case REG_DWORD:        reg.GetDWORDValue hive, key, name, value
  case REG_QWORD:        reg.GetQWORDValue hive, key, name, value
  case REG_MULTI_SZ:
    reg.GetMultiStringValue hive, key, name, aData
    If Not IsNull(aData) Then
      for i = 0 to ubound(aData)
        value = value & aData(i) & "\n"
      next
    End if
  case REG_BINARY:
    reg.GetBinaryValue hive, key, name, bData
    If Not IsNull(bData) Then
      for i = 0 to ubound(bData)
        value = value & Right("0" & hex(bData(i)), 2)
      next
    end if
  End Select
 
  ReadParam = value
 
End Function

Function GetHiveNameByHandle(Handle)
    Select Case Handle
        Case HKEY_CLASSES_ROOT
            GetHiveNameByHandle = "HKEY_CLASSES_ROOT"
        Case HKEY_CURRENT_USER
            GetHiveNameByHandle = "HKEY_CURRENT_USER"
        Case HKEY_LOCAL_MACHINE
            GetHiveNameByHandle = "HKEY_LOCAL_MACHINE"
        Case HKEY_USERS
            GetHiveNameByHandle = "HKEY_USERS"
        Case HKEY_CURRENT_CONFIG
            GetHiveNameByHandle = "HKEY_CURRENT_CONFIG"
    End Select
End Function

Public Function GetHKey(ByVal HKeyName)
    Dim pos
    pos = InStr(HKeyName, "\")
    If pos <> 0 Then HKeyName = Left(HKeyName, pos - 1)
    Select Case UCase(HKeyName)
        Case "HKEY_CLASSES_ROOT", "HKCR"
            GetHKey = HKEY_CLASSES_ROOT
        Case "HKEY_CURRENT_USER", "HKCU"
            GetHKey = HKEY_CURRENT_USER
        Case "HKEY_LOCAL_MACHINE", "HKLM"
            GetHKey = HKEY_LOCAL_MACHINE
        Case "HKEY_USERS", "HKU"
            GetHKey = HKEY_USERS
        Case "HKEY_CURRENT_CONFIG", "HKCC"
            GetHKey = HKEY_CURRENT_CONFIG
    End Select
End Function

Public Function GetKeyTypeName(iType)
  Select Case iType
  case REG_SZ:            GetKeyTypeName = "REG_SZ"
  case REG_EXPAND_SZ:     GetKeyTypeName = "REG_EXPAND_SZ"
  case REG_DWORD:        GetKeyTypeName = "REG_DWORD"
  case REG_QWORD:        GetKeyTypeName = "REG_QWORD"
  case REG_MULTI_SZ:    GetKeyTypeName = "REG_MULTI_SZ"
  case REG_BINARY:        GetKeyTypeName = "REG_BINARY"
  End Select
End Function

Public Sub NormalizeKeyNameAndHiveHandle(ByRef lHive, ByRef in_out_KeyName)
    Dim iPos
    If lHive = 0 Then
        lHive = GetHKey(in_out_KeyName)
        iPos = InStr(in_out_KeyName, "\")
        If (iPos <> 0) Then in_out_KeyName = Mid(in_out_KeyName, iPos + 1) Else in_out_KeyName = vbNullString
    End If
End Sub

Sub LogKey(str)
    ts.WriteLine(str)
End Sub

Sub LogValue(str)
    ts.WriteLine(Profile & ";" & str)
End Sub

Положить рядом.
Запустить от имени Админа.

set log= поменяете на нужный.
 
@Dragokas, Как я понимаю, EnumKey.vbs выполняет функцию парсера данных. Трудозатратно будет изменить немного скрипт?

Сейчас выгрузка данных идет, так, что данные выгружаются по порядку от каждого пользователя при чтении его улья. Понимаю, что это логичнее с точки зрения выгрузки данных, но отображение данных в файле csv удобнее будет читать, когда указана ветка и уже в этой ветке указан пользователь.

Например, Нам у всех пользователей надо выгрузить ветку из реестра:
HKEY_USERS\Улий Пользователя\SOFTWARE\Google\Chrome\PreferenceMACs\Default\extensions.settings

Данные сейчас при выгрузке будут отображаться как:

Путь до ветки реестра определенного пользователя:
Путь до профиля пользователя - параметры реестра.
Путь до ветки реестра определенного пользователя:
Путь до профиля пользователя - параметры реестра.
Пример выгрузки без параметров реестра:
CMD/BATCH:
HKEY_USERS\*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
C:\Users\vap
HKEY_USERS\*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
C:\Users\vap
HKEY_USERS\*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
C:\Users\sergeeva_1
C:\Users\sergeeva_1
C:\Users\sergeeva_1
HKEY_USERS\*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
C:\Users\sergeeva
C:\Users\sergeeva
C:\Users\sergeeva

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

Код:
HKEY_USERS\*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
C:\Users\vap
C:\Users\sergeeva_1
C:\Users\sergeeva_1
C:\Users\sergeeva_1
C:\Users\sergeeva
C:\Users\sergeeva
C:\Users\sergeeva
И также при добавлении необходимо ветки можно ли в скрипте прописать комментарии, которые бы грузились в CSV?

Есть задачи разного характера. Например, выгрузить данные у пользователя об установленных плагинах:
Парсим ветку реестра:
HKEY_USERS\*\SOFTWARE\Google\Chrome\PreferenceMACs\Default\extensions.settings
Перед выгрузкой данных этой ветки комментируем, что выгружаем. Понимаю, что парсер на все случае жизни создать нельзя, но хотя бы часть данных выгружать таким способом можно.
Есть уже готовые продукты на тематику Forensic реестра, но они платные.
Есть беcплатные, но они не могут читать данные улий, что смонтированны уже в систему.
 
Последнее редактирование:
Я не понимаю, чего вы хотите. Какой пример показали в посте № 4, так я и сделал один в один.
А сейчас я вообще не понимаю, что должны быть. Какие-то комментарии, что куда откуда ....
Покажите четкий пример, как это было в посте № 4.
 
Последнее редактирование:
@Dragokas,
Как выгрузка выглядит сейчас:
CMD/BATCH:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant;;;
Global;NotFirstRun;REG_DWORD;1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers;;;
Global;C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpnui.exe;REG_SZ;~ GDIDPISCALING DPIUNAWARE
Global;D:\MY\ПАТЧИ ДЛЯ ИГР\Старые добрые игры\Enemy Infestation\Enemy Infestation\Enemy Infestation (1998)\Ei.exe;REG_SZ;$ DWM8And16BitMitigation
Global;F:\GOG Games\UBOAT\UBOAT.exe;REG_SZ;HIGHDPIAWARE
HKEY_USERS\S-1-5-21-2476665161-3334250923-4046740948-1003\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant;;;
HKEY_USERS\S-1-5-21-2476665161-3334250923-4046740948-1003\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted;;;
C:\Users\vasya;C:\Program Files (x86)\Ubisoft\Ubisoft Game Launcher\upc.exe;REG_DWORD;32
C:\Users\vasya;C:\Users\vasya\Downloads\Hisuite_10.1.0.550_OVE\Hisuite_10.1.0.550_OVE\Setup.exe;REG_DWORD;1
C:\Users\vasya;C:\Users\vasya\AppData\Local\HiSuite\userdata\LiveUpdateHisuite\full\HiSuite V500R001B007D30SP00C06\2AB88B48FB288E00\Setup.exe;REG_DWORD;1
C:\Users\vasya;C:\Users\vasya\AppData\Local\Temp\7zS6B2A.tmp\setup.exe;REG_DWORD;1
C:\Users\vasya;C:\Program Files (x86)\InstallShield Installation Information\{8833FFB6-5B0C-4764-81AA-06DFEED9A476}\setup.exe;REG_DWORD;33
C:\Users\vasya;C:\Program Files (x86)\Realtek\NICDRV_8169\RTINSTALLER64.EXE;REG_DWORD;1
HKEY_USERS\S-1-5-21-2476665161-3334250923-4046740948-1003\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store;;;
C:\Users\vasya;D:\MY\MY\программы\антивирусы\kaspersky rus\kts2020\kts20.0.14.1085abru_19117.exe;REG_BINARY;5341435001000000000000000700000028000000E0EE9F0AE8C3A00A01000000000000000000000A00210000631F6E6F0EDED40100000000000000000200000028000000000000000000004000000000000000000000000000000000E0D21700000000000100000001000000
C:\Users\vasya;SIGN.MEDIA=71426 SETUP.EXE;REG_BINARY;5341435001000000000000000700000028000000781507007853070001000000000000000000010600210000631F6E6F0EDED40100000000000000000200000028000000000000000000005000000000000000000000000000000000F65F0600000000000100000001000000
HKEY_USERS\S-1-5-21-2476665161-3334250923-4046740948-1003\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers;;;
C:\Users\vasya;D:\MY\ПАТЧИ ДЛЯ ИГР\SNES\Контроллер\Gamepad\PRO\SN30pro+SF30pro_Firmware_V1.33\8Bitdo_Update.exe;REG_SZ;$ WinBlueRTM
C:\Users\vasya;D:\MY\ПАТЧИ ДЛЯ ИГР\Старые добрые игры\Enemy Infestation\Enemy Infestation\Enemy Infestation (1998)\Ei.exe;REG_SZ;DWM8And16BitMitigation
C:\Users\vasya;F:\GOG Games\UBOAT\UBOAT.exe;REG_SZ;HIGHDPIAWARE
HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant;;;
HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store;;;
C:\Users\vasya;C:\Users\vasya\AppData\Local\Microsoft\OneDrive\19.002.0107.0005\FileSyncConfig.exe;REG_BINARY;5341435001000000000000000700000028000000308104009156050001000000000000000000000A00210000631F6E6F0EDED4010000000100000000
C:\Users\vasya;C:\Users\vasya\AppData\Local\Microsoft\OneDrive\Update\OneDriveSetup.exe;REG_BINARY;534143500100000000000000070000002800000078D8160264B9170201000000000000000000000A00210000631F6E6F0EDED4010000000100000000
C:\Users\vasya;C:\Users\vasya\AppData\Local\Microsoft\OneDrive\19.174.0902.0013\FileSyncConfig.exe;REG_BINARY;5341435001000000000000000700000028000000789E0500CD91060001000000000000000000000A00210000631F6E6F0EDED4010000000100000000
HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant;;;
HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store;;;
C:\Users\Admin;C:\Users\Admin\AppData\Local\Microsoft\OneDrive\19.043.0304.0013\FileSyncConfig.exe;REG_BINARY;534143500100000000000000070000002800000060AE040085EF040001000000000000000000000A0021000050BB64EDDDACD5010000000100000000
C:\Users\Admin;C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE;REG_BINARY;534143500100000000000000070000002800000078983701BBC237010100000000000000000001060001000050BB64EDDDACD5010000000100000000
C:\Users\Admin;C:\Program Files\WinRAR\WinRAR.exe;REG_BINARY;5341435001000000000000000700000028000000D0D524004BDC240001000000000000000000000A0021000050BB64EDDDACD501000000000000000002000000280000000000000000000000000000000000000000000000000000003E490000000000000100000001000000
C:\Users\Admin;D:\MY\ПАТЧИ ДЛЯ ИГР\Старые добрые игры\Enemy Infestation\Enemy Infestation\Enemy Infestation (1998)\Ei.exe;REG_BINARY;534143500100000000000000070000002800000000820600000000000100000000000000000001057120000050BB64EDDDACD5010000000000000000
HKEY_USERS\Custom\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers;;;
C:\Users\Admin;D:\MY\ПАТЧИ ДЛЯ ИГР\Старые добрые игры\Enemy Infestation\Enemy Infestation\Enemy Infestation (1998)\Ei.exe;REG_SZ;DWM8And16BitMitigation

Как эта выгрузка должна выглядеть:
CMD/BATCH:
;Комментарий 1
*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant;;;
Global;NotFirstRun;REG_DWORD;1

;Комментарий 2
*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers;;;
Global;C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpnui.exe;REG_SZ;~ GDIDPISCALING DPIUNAWARE
Global;D:\MY\ПАТЧИ ДЛЯ ИГР\Старые добрые игры\Enemy Infestation\Enemy Infestation\Enemy Infestation (1998)\Ei.exe;REG_SZ;$ DWM8And16BitMitigation
Global;F:\GOG Games\UBOAT\UBOAT.exe;REG_SZ;HIGHDPIAWARE
C:\Users\vasya;D:\MY\ПАТЧИ ДЛЯ ИГР\SNES\Контроллер\Gamepad\PRO\SN30pro+SF30pro_Firmware_V1.33\8Bitdo_Update.exe;REG_SZ;$ WinBlueRTM
C:\Users\vasya;D:\MY\ПАТЧИ ДЛЯ ИГР\Старые добрые игры\Enemy Infestation\Enemy Infestation\Enemy Infestation (1998)\Ei.exe;REG_SZ;DWM8And16BitMitigation
C:\Users\vasya;F:\GOG Games\UBOAT\UBOAT.exe;REG_SZ;HIGHDPIAWARE
C:\Users\Admin;D:\MY\ПАТЧИ ДЛЯ ИГР\Старые добрые игры\Enemy Infestation\Enemy Infestation\Enemy Infestation (1998)\Ei.exe;REG_SZ;DWM8And16BitMitigation

Комментарий 3
*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted;;;
C:\Users\vasya;C:\Program Files (x86)\Ubisoft\Ubisoft Game Launcher\upc.exe;REG_DWORD;32
C:\Users\vasya;C:\Users\vasya\Downloads\Hisuite_10.1.0.550_OVE\Hisuite_10.1.0.550_OVE\Setup.exe;REG_DWORD;1
C:\Users\vasya;C:\Users\vasya\AppData\Local\HiSuite\userdata\LiveUpdateHisuite\full\HiSuite V500R001B007D30SP00C06\2AB88B48FB288E00\Setup.exe;REG_DWORD;1
C:\Users\vasya;C:\Users\vasya\AppData\Local\Temp\7zS6B2A.tmp\setup.exe;REG_DWORD;1
C:\Users\vasya;C:\Program Files (x86)\InstallShield Installation Information\{8833FFB6-5B0C-4764-81AA-06DFEED9A476}\setup.exe;REG_DWORD;33
C:\Users\vasya;C:\Program Files (x86)\Realtek\NICDRV_8169\RTINSTALLER64.EXE;REG_DWORD;1

Комментарий 4
*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store;;;
C:\Users\vasya;D:\MY\MY\программы\антивирусы\kaspersky rus\kts2020\kts20.0.14.1085abru_19117.exe;REG_BINARY;5341435001000000000000000700000028000000E0EE9F0AE8C3A00A01000000000000000000000A00210000631F6E6F0EDED40100000000000000000200000028000000000000000000004000000000000000000000000000000000E0D21700000000000100000001000000
C:\Users\vasya;SIGN.MEDIA=71426 SETUP.EXE;REG_BINARY;5341435001000000000000000700000028000000781507007853070001000000000000000000010600210000631F6E6F0EDED40100000000000000000200000028000000000000000000005000000000000000000000000000000000F65F0600000000000100000001000000
C:\Users\vasya;C:\Users\vasya\AppData\Local\Microsoft\OneDrive\19.002.0107.0005\FileSyncConfig.exe;REG_BINARY;5341435001000000000000000700000028000000308104009156050001000000000000000000000A00210000631F6E6F0EDED4010000000100000000
C:\Users\vasya;C:\Users\vasya\AppData\Local\Microsoft\OneDrive\Update\OneDriveSetup.exe;REG_BINARY;534143500100000000000000070000002800000078D8160264B9170201000000000000000000000A00210000631F6E6F0EDED4010000000100000000
C:\Users\vasya;C:\Users\vasya\AppData\Local\Microsoft\OneDrive\19.174.0902.0013\FileSyncConfig.exe;REG_BINARY;5341435001000000000000000700000028000000789E0500CD91060001000000000000000000000A00210000631F6E6F0EDED4010000000100000000
C:\Users\Admin;C:\Users\Admin\AppData\Local\Microsoft\OneDrive\19.043.0304.0013\FileSyncConfig.exe;REG_BINARY;534143500100000000000000070000002800000060AE040085EF040001000000000000000000000A0021000050BB64EDDDACD5010000000100000000
C:\Users\Admin;C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE;REG_BINARY;534143500100000000000000070000002800000078983701BBC237010100000000000000000001060001000050BB64EDDDACD5010000000100000000
C:\Users\Admin;C:\Program Files\WinRAR\WinRAR.exe;REG_BINARY;5341435001000000000000000700000028000000D0D524004BDC240001000000000000000000000A0021000050BB64EDDDACD501000000000000000002000000280000000000000000000000000000000000000000000000000000003E490000000000000100000001000000
C:\Users\Admin;D:\MY\ПАТЧИ ДЛЯ ИГР\Старые добрые игры\Enemy Infestation\Enemy Infestation\Enemy Infestation (1998)\Ei.exe;REG_BINARY;534143500100000000000000070000002800000000820600000000000100000000000000000001057120000050BB64EDDDACD5010000000000000000
 
;Комментарий 1
;Комментарий 2

---------------------
А откуда эти комментарии должны браться?
 
К, примеру, добавим новую ветку реестра. И тут же загрузку комментария от автора в файл.

CMD/BATCH:
:LogHive [prefix]
  set /p "=[KEY.1] "<NUL
  call :EnumKey "%~1\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant"
  set /p "=[KEY.2] "<NUL
  call :EnumKey "%~1\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
  set /p "=[KEY.3] "<NUL
  call :EnumKey "%~1\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store"
  set /p "=[KEY.4] "<NUL
  call :EnumKey "%~1\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted"
exit /b
 
В каком смысле от автора?
Вы вручную с консоли каждый раз будете вводить?
 
Я имею ввиду, что к примеру, буду добавлять ветку в реестре, которую надо распарсить, + напишу комментарий к ней. А то веток может быть много. Или ключевое слово, чтобы по поиску было проще искать.
 
Понял, что вы хотите.
Только вот эти ключи не нужны:
Код:
call :EnumKey "%~1\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store"
call :EnumKey "%~1\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted"
EnumKey.vbs умеет ходить вглубь.
 
Держите.

Layers.cmd
CMD/BATCH:
@echo off
SetLocal EnableExtensions

set log=%~dp0user.csv

del "%log%" 2>NUL

:: Экспорт глобального улья (HKLM)
echo [HKLM]
set "profiles=Global"
call :LogHive "HKLM"

:: Экспорт из уже смонтированных ульев (залогиненных пользователей)
for /F %%r in ('reg query hku ^| find /i "S-1-5-21-" ^| find /v /i "Classes"') do (
  for /f "tokens=2 delims=\" %%a in ("%%~r") do (
    echo.
    rem Извлечение пути к профилю
    for /f "tokens=2*" %%b in (
      'reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%%~a" /v "ProfileImagePath" ^| find /i "ProfileImagePath"'
    ) do echo [HKU] %%c& set "profiles=%%c"
  )
  call :LogHive "%%~r"
)

:: Монтирование файла улья из папок каждого из пользователей (которые не залогинены; для залогиненных будет получен отказ в доступе)
for /F "tokens=2*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /s /v "ProfileImagePath" ^| find /i "Users"') do (
  set profiles=%%j
  call :mount
)
echo.
pause
goto :eof

:mount [HiveFile]
  echo.
  echo [HIV] %profiles%
  REG unload HKEY_USERS\Custom 2>NUL
  set /p "=[M+] "<NUL
  REG load HKEY_USERS\Custom "%profiles%\NTUSER.DAT" || exit /b 1
  call :LogHive "HKEY_USERS\Custom"
  set /p "=[M-] "<NUL
  REG unload HKEY_USERS\Custom
  timeout /t 1 >NUL
exit /b 0

:LogHive [prefix]
  set /p "=[KEY.1] "<NUL
  call :EnumKey "%~1" "\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant" "Compatibility Assistant"
  set /p "=[KEY.2] "<NUL
  call :EnumKey "%~1" "\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "Layers"
exit /b

:EnumKey [prefix] [key] [comment]
  REG Query "%~1%~2" >NUL && (
    echo [OK]
    cscript.exe //nologo "%~dp0EnumKey.vbs" "%log%" "%profiles%" "%~1" "%~2" "%~3"
  )
exit /b

EnumKey.vbs

VB.NET / VBA:
Option Explicit

Const HKEY_CLASSES_ROOT    = &H80000000
Const HKEY_CURRENT_USER    = &H80000001
Const HKEY_LOCAL_MACHINE    = &H80000002
Const HKEY_USERS            = &H80000003
Const HKEY_CURRENT_CONFIG    = &H80000005

Const REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const REG_BINARY = 3
Const REG_DWORD = 4
Const REG_MULTI_SZ = 7
Const REG_QWORD = 11

Const FILE_APPEND_MODE = 8

Dim WshShell, reg, fso, ts
Dim sLog, Profile, sPrefix, strKey, sComment, hive, hasKeyHeader, hasComment

Set WshShell = CreateObject("WScript.Shell")
Set reg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
Set fso = CreateObject("Scripting.FileSystemObject")

hive = 0

sLog = WScript.Arguments(0)
Profile = WScript.Arguments(1)
sPrefix = WSCript.Arguments(2)
strKey = WSCript.Arguments(3)
sComment = WSCript.Arguments(4)


Set ts = fso.OpenTextFile(sLog, FILE_APPEND_MODE, true)

NormalizeKeyNameAndHiveHandle hive, sPrefix

EnumerateKeys hive, sPrefix, strKey

ts.Close

Sub EnumerateKeys(hive, sPrefix, key)
  On Error Resume Next
  Dim i, name, iType, arrNames, arrTypes, PrefAndKey, arrSubKeys, subkey

  PrefAndKey = BuildPath(sPrefix, key)
 
  reg.EnumValues hive, PrefAndKey, arrNames, arrTypes
 
  If Not IsNull(arrNames) Then
    for i = 0 to Ubound(arrNames)
      name = arrNames(i)
      iType = arrTypes(i)
      if name <> "" and IsNumeric(iType) then
        if not hasComment Then
          LogKey vbCrLf & ";" & sComment
          hasComment = true
        end if
        if not hasKeyHeader Then
          LogKey key
          hasKeyHeader = true
        end if
        LogValue name & ";" & GetKeyTypeName(iType) & ";" & ReadParam(hive, PrefAndKey, name, iType)
      end if
    next
  end if
 
  reg.EnumKey hive, PrefAndKey, arrSubKeys
 
  If Not IsNull(arrSubKeys) Then
    hasKeyHeader = false
    For Each subkey In arrSubKeys
      EnumerateKeys hive, sPrefix, key & "\" & subkey
    Next
  End If
End Sub

Function ReadParam(hive, key, name, iType)
  Dim value, i, bData
  Select Case iType
  case REG_SZ:            reg.GetStringValue hive, key, name, value
  case REG_EXPAND_SZ:     value = WshShell.RegRead(GetHiveNameByHandle(hive) & "\" & key & "\" & name)
  case REG_DWORD:        reg.GetDWORDValue hive, key, name, value
  case REG_QWORD:        reg.GetQWORDValue hive, key, name, value
  case REG_MULTI_SZ:
    reg.GetMultiStringValue hive, key, name, aData
    If Not IsNull(aData) Then
      for i = 0 to ubound(aData)
        value = value & aData(i) & "\n"
      next
    End if
  case REG_BINARY:
    reg.GetBinaryValue hive, key, name, bData
    If Not IsNull(bData) Then
      for i = 0 to ubound(bData)
        value = value & Right("0" & hex(bData(i)), 2)
      next
    end if
  End Select
 
  ReadParam = value
 
End Function

Function GetHiveNameByHandle(Handle)
    Select Case Handle
        Case HKEY_CLASSES_ROOT
            GetHiveNameByHandle = "HKEY_CLASSES_ROOT"
        Case HKEY_CURRENT_USER
            GetHiveNameByHandle = "HKEY_CURRENT_USER"
        Case HKEY_LOCAL_MACHINE
            GetHiveNameByHandle = "HKEY_LOCAL_MACHINE"
        Case HKEY_USERS
            GetHiveNameByHandle = "HKEY_USERS"
        Case HKEY_CURRENT_CONFIG
            GetHiveNameByHandle = "HKEY_CURRENT_CONFIG"
    End Select
End Function

Public Function GetHKey(ByVal HKeyName)
    Dim pos
    pos = InStr(HKeyName, "\")
    If pos <> 0 Then HKeyName = Left(HKeyName, pos - 1)
    Select Case UCase(HKeyName)
        Case "HKEY_CLASSES_ROOT", "HKCR"
            GetHKey = HKEY_CLASSES_ROOT
        Case "HKEY_CURRENT_USER", "HKCU"
            GetHKey = HKEY_CURRENT_USER
        Case "HKEY_LOCAL_MACHINE", "HKLM"
            GetHKey = HKEY_LOCAL_MACHINE
        Case "HKEY_USERS", "HKU"
            GetHKey = HKEY_USERS
        Case "HKEY_CURRENT_CONFIG", "HKCC"
            GetHKey = HKEY_CURRENT_CONFIG
    End Select
End Function

Public Function GetKeyTypeName(iType)
  Select Case iType
  case REG_SZ:            GetKeyTypeName = "REG_SZ"
  case REG_EXPAND_SZ:     GetKeyTypeName = "REG_EXPAND_SZ"
  case REG_DWORD:        GetKeyTypeName = "REG_DWORD"
  case REG_QWORD:        GetKeyTypeName = "REG_QWORD"
  case REG_MULTI_SZ:    GetKeyTypeName = "REG_MULTI_SZ"
  case REG_BINARY:        GetKeyTypeName = "REG_BINARY"
  End Select
End Function

Public Sub NormalizeKeyNameAndHiveHandle(ByRef lHive, ByRef in_out_KeyName)
    Dim iPos
    If lHive = 0 Then
        lHive = GetHKey(in_out_KeyName)
        iPos = InStr(in_out_KeyName, "\")
        If (iPos <> 0) Then in_out_KeyName = Mid(in_out_KeyName, iPos + 1) Else in_out_KeyName = vbNullString
    End If
End Sub

Sub LogKey(str)
    ts.WriteLine(str)
End Sub

Sub LogValue(str)
    ts.WriteLine(Profile & ";" & str)
End Sub

Function BuildPath(byval s1, byval s2)
    if Right(s1, 1) = "\" then s1 = Left(s1, len(s1) - 1)
    if Left(s2, 1) <> "\" then s2 = "\" & s2
    BuildPath = s1 & s2
    if Left(BuildPath, 1) = "\" then BuildPath = Mid(BuildPath, 2)
End Function
 
Назад
Сверху Снизу