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

bboymig

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

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%;
Спасибо.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,538
Реакции
5,995
Баллы
798
Не могу понять как исправить 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-*

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

bboymig

Новый пользователь
Сообщения
10
Реакции
0
Баллы
11
@Чугуев, совершенно верно.
Результат работы должен быть таким.
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.
А мне необходимы все ветки, всех пользователей. Это необходимо для анализа и поиска первичных индикаторов компроментации в системе.
 

bboymig

Новый пользователь
Сообщения
10
Реакции
0
Баллы
11
@Dragokas, Сейчас тот вариант что Вы предложили работает некорректно.
Выгружает не всю информацию от пользователя Admin.
Поторопился с выводами. Данные почему то выгружались у меня под текущим пользователем. У Вас все корректно.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,538
Реакции
5,995
Баллы
798
А мой Bat файл выгружает данные в два раза больше:
То, что он выгружает в два раза больше, не означает, что он работает правильно, а мой некорректно.
Посмотрите на строку
Код:
REG Query "HKEY_CURRENT_USER ...
вашего кода.
Вы всегда выгружаете данные из ветки текущего пользователя, а не того, которого смонтировали.
Смонтированный находится по адресу HKEY_USERS\Custom\...

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

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

bboymig

Новый пользователь
Сообщения
10
Реакции
0
Баллы
11
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
Сделать такую же структуру у файла.
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,538
Реакции
5,995
Баллы
798
Та ещё задачка.
У Batch нет возможности делать такой форматный вывод.
Попробую на VBS сделать форматирование.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,538
Реакции
5,995
Баллы
798
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:
'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= поменяете на нужный.
 
Сверху Снизу