Тема: CMD/BAT: Поиск в реестре по дате
Есть ли консольные средства?
(знаю на ps можно, к тому же есть гуёвые RegCmd.exe? и RegScanner.exe)
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть ли консольные средства?
(знаю на ps можно, к тому же есть гуёвые RegCmd.exe? и RegScanner.exe)
Без понятия...
Но REGEDIT позволяет делать экспорт выбранного раздела реестра в тектовый файл, содержащий последнее время записи каждого из подразделов. (Не знаю, существуют ли ключи, чтобы это сделать из командной строки.)
Затем этот файл можно открыть в текстовом редакторе и произвести поиск по требуемой дате. А можно написать командный файл для этой цели. Файл создаётся в юникоде, для преобразования его в кодировку DOS можно использовать команду TYPE.
Для комстроки есть команда REG:
>reg export /?
Только в текстовый файл можно, имхо, только с GUI regedit выгрузить.
Имеется в виду именно та разновидность TXT-файла, которая с датами.
Только в текстовый файл можно, имхо, только с GUI regedit выгрузить.
Имеется в виду именно та разновидность TXT-файла, которая с датами.
Все верно и только в TXT, не знал об этом. Вдруг кому-то пригодится, вариант на PS
#Set-ExecutionPolicy Unrestricted - Разрешается выполнение любых сценариев PowerShell без проверки цифровой подписи.
param ( [string] $Key, [string] $SubKey )
switch ($Key) {
"HKCR" { $searchKey = 0x80000000} #HK Classes Root
"HKCU" { $searchKey = 0x80000001} #HK Current User
"HKLM" { $searchKey = 0x80000002} #HK Local Machine
"HKU" { $searchKey = 0x80000003} #HK Users
"HKCC" { $searchKey = 0x80000005} #HK Current Config
default {
#throw "Invalid Key. Use one of the following options HKCR, HKCU, HKLM, HKU, HKCC"
}
}
$KEYQUERYVALUE = 0x1
$KEYREAD = 0x19
$KEYALLACCESS = 0x3F
$sig1 = @'
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(
int hKey,
string subKey,
int ulOptions,
int samDesired,
out int hkResult);
'@
$type1 = Add-Type -MemberDefinition $sig1 -Name Win32Utils `
-Namespace RegOpenKeyEx -Using System.Text -PassThru
$sig2 = @'
[DllImport("advapi32.dll", EntryPoint = "RegEnumKeyEx")]
extern public static int RegEnumKeyEx(
int hkey,
int index,
StringBuilder lpName,
ref int lpcbName,
int reserved,
int lpClass,
int lpcbClass,
out long lpftLastWriteTime);
'@
$type2 = Add-Type -MemberDefinition $sig2 -Name Win32Utils `
-Namespace RegEnumKeyEx -Using System.Text -PassThru
$sig3 = @'
[DllImport("advapi32.dll", SetLastError=true)]
public static extern int RegCloseKey(
int hKey);
'@
$type3 = Add-Type -MemberDefinition $sig3 -Name Win32Utils `
-Namespace RegCloseKey -Using System.Text -PassThru
$hKey = new-object int
$result = $type1::RegOpenKeyEx($searchKey, $SubKey, 0, $KEYREAD, [ref] $hKey)
#initialize variables
$builder = New-Object System.Text.StringBuilder 1024
$index = 0
$length = [int] 1024
$time = New-Object Long
#234 means more info, 0 means success. Either way, keep reading
while ( 0,234 -contains $type2::RegEnumKeyEx($hKey, $index++, `
$builder, [ref] $length, $null, $null, $null, [ref] $time) )
{
#create output object
$o = "" | Select Key, LastWriteTime
$o.Key = $builder.ToString()
$o.LastWriteTime = (Get-Date $time).AddYears(1600)
$o
#reinitialize for next time through the loop
$length = [int] 1024
$builder = New-Object System.Text.StringBuilder 1024
}
$result = $type3::RegCloseKey($hKey);вариант на PS
Хм... код размашист. Лучше все WinAPI вызовы в одну сигнатуру прибрать - все равно же обращение будет по NameSpace, хотя на Вашем месте бы я вообще всю логику описал в сигнатуре, сведя тем самым до минимума обращение к определенным в ней функциям. Но это лишь мое мнение. В целом, молодцом! Можно даже в коллекцию.
Непосредственно по теме.
У самого была необходимость извлекать подобные данные. В Far'е для этого есть плагин, а вот с комстрокой не все так просто. Хочется написать программку, да времени не хватает катастрофически на все про все.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться