PDA

Показать полную графическую версию : Массовое определение контрольных сумм файлов


Страниц : [1] 2

alexdomovoi
28-12-2024, 13:19
Добрый день! Хочу в папке Windows всем exe файлам определить контрольные суммы (в дальнейшем и не только в Windows). Через PowerShell:

param (
[string]$FolderPath, # c:\windows
[string]$LogFile = "c:\1\checksums.log"
)
if (-Not (Test-Path $FolderPath))
{
Write-Host "Путь не найден: $FolderPath"
exit
}
$files = Get-ChildItem -Path $FolderPath -Recurse -Filter *.exe
$logFileStream = New-Object System.IO.StreamWriter($LogFile, $false)
foreach ($file in $files) {
try {
$hash = Get-FileHash -Path $file.FullName -Algorithm SHA256
$logEntry = "{0} {1}" -f $hash.Hash, $file.FullName
$logFileStream.WriteLine($logEntry)
Write-Host "Контрольная сумма для $($file.FullName): $($hash.Hash)"
} catch {
Write-Host "Ошибка при обработке файла $($file.FullName): $_"
}
}
$logFileStream.Close()
Write-Host "Результаты сохранены в $LogFile"


На windows 10 вроде как делает но выходит ошибка (которая не мешает проведению контроля целостности):


Test-Path : Не удается привязать аргумент к параметру "Path", так как он представляет собой пустую строку.
строка:1 знак:21
+ if (-Not (Test-Path $FolderPath))
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Very Happy [Test-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Test
PathCommand


На 7 и XP пытается делать но результата ноль ошибка другого формата:

Test-Path : Не удается привязать аргумент к параметру "Path", так как он представляет собой пустую строку.
строка:5 знак:20
+ if (-Not (Test-Path <<<< $FolderPath))
+ CategoryInfo : InvalidData: (Very Happy [Test-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Test
PathCommand

Ошибка при обработке файла C:\windows\explorer.exe: Имя "Get-FileHash" не распознано как имя командлета, функции, файла
скрипта или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после че
го повторите попытку.
Ошибка при обработке файла C:\windows\hh.exe: Имя "Get-FileHash" не распознано как имя командлета, функции, файла скрипт
а или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего пов
торите попытку.


Подскажите, что подправить, что бы взлетело? Спасибо!

NickM
28-12-2024, 13:37
На windows 10 вроде как делает но выходит ошибка (которая не мешает проведению контроля целостности): »
Параметр для задания каталога Вы передаёте? Каким образом Вы запускаете сценарий?

Как вариант, задайте путь к каталогу в первой переменной, как это присвоение сделано во второй переменной.

alexdomovoi
28-12-2024, 13:48
Параметр для задания каталога Вы передаёте? Каким образом Вы запускаете сценарий? »
Запускаю PowerShell под админом туда копирую код и все.

NickM
28-12-2024, 14:00
Запускаю PowerShell под админом туда копирую код и все. »
Ну вот, а первый параметр следует передавать, поэтому:
Как вариант, задайте путь к каталогу в первой переменной, как это присвоение сделано во второй переменной. »

YuS_2
28-12-2024, 14:04
На windows 10 вроде как делает но выходит ошибка (которая не мешает проведению контроля целостности) »
Что-то Вы недоговариваете...

Test-Path : Не удается привязать аргумент к параметру "Path", так как он представляет собой пустую строку. »
такая ошибка возникнет только тогда, когда скрипт будет запущен без параметра с указанным каталогом для проверки...

Ошибка при обработке файла C:\windows\explorer.exe: Имя "Get-FileHash" не распознано как имя командлета, функции, файла
скрипта или выполняемой программы. »
А здесь, вроде по-русски написано... в powershell версии 2.0 попросту нет такого командлета. Обновляйте powershell в win7, а XP - придумайте, что-то другое для подсчета hash

Запускаю PowerShell под админом туда копирую код и все. »
Этот код написан для файла сценария, которому при запуске необходимо задавать каталог в качестве параметра.
Если хотите запускать так, то эту часть измените:
param (
[string]$FolderPath, # c:\windows
[string]$LogFile = "c:\1\checksums.log"
)
на:
[string]$FolderPath = 'c:\windows'
[string]$LogFile = "c:\1\checksums.log"

DJ Mogarych
28-12-2024, 21:36
Можно через 7-zip:

$7z = 'C:\Program Files\7-Zip\7z.exe'
$report = @()
dir C:\temp\*.exe |% {
$obj = [pscustomobject]@{
Path = $_.fullname
Checksum = (& $7z h -scrcsha256 $_.fullname) -match 'for data' -replace '.*\s+' -as [string]
}
$report += $obj
}



# Выгрузка в CSV
$report |export-csv c:\temp\checksum.csv -Encoding utf8 -Delimiter ';' -NoTypeInformation

gc c:\temp\checksum.csv

"Path";"Checksum"
"C:\temp\DjVuLibre-3.5.28_DjView-4.12_Setup.exe";"16c0a63926d0380280f35c8d9570efe01032c03c262ba61aa72a341b8cb58469"
"C:\temp\handheld_quake_setup.exe";"cdc755bd5052d3b7a4d837e579d932baef2162fcad001479f2214b1506bb43ee"
"C:\temp\LibreELEC.USB-SD.Creator.Win32.exe";"3730ee946845d59d85926d7f55b3149b3ba3fc8db8d2bec319f3c3c635ba9775"

Vadikan
29-12-2024, 14:22
Зачем 7-zip если есть certutil https://www.outsidethebox.ms/10527/

DJ Mogarych
29-12-2024, 15:19
Вариант с certutil в скрипте выше

$7z = 'C:\Program Files\7-Zip\7z.exe'
Checksum = (& certutil.exe -hashfile $_.fullname sha256)[1]

Vadikan
29-12-2024, 18:57
DJ Mogarych, проверял? Алгоритм хэша надо указывать в верхнем регистре:) Трюки утилиты certutil (https://www.outsidethebox.ms/10527/)

DJ Mogarych
29-12-2024, 19:26
И в нижнем работает:

PS C:\WINDOWS\System32> $report |select -first 5

Path Checksum
---- --------
C:\WINDOWS\System32\agentactivationruntimestarter.exe be21cc87cd36ef8b88d738cd227270c0355ba93e2e4eff72e9fbf1d5c50de348
C:\WINDOWS\System32\AgentService.exe 1adf75a3cd3eb83aebc8a6d72853970857f9b0cabdc29e5d6fbb915f2f7d688c
C:\WINDOWS\System32\AggregatorHost.exe 64aa037f7033a7b9701bddc8fa2f0aa34765d354eaec413719a3eeb466cfd703
C:\WINDOWS\System32\aitstatic.exe 3aa57252eed27c048e58a16d7f2e9e80e3c860e29af0e7c8cad1f95b082f5858
C:\WINDOWS\System32\alg.exe 268d5226f97813b3280b67ad3037c2aadd32bee89e319df760d79f67e1f5388b

Vadikan
29-12-2024, 19:54
DJ Mogarych, значит исправили

alexdomovoi
30-12-2024, 02:31
И в нижнем работает:
Код: Выделить весь код
PS C:\WINDOWS\System32> $report |select -first 5
Path Checksum
---- --------
C:\WINDOWS\System32\agentactivationruntimestarter.exe be21cc87cd36ef8b88d738cd227270c0355ba93e2e4eff72e9fbf1d5c50de348
C:\WINDOWS\System32\AgentService.exe 1adf75a3cd3eb83aebc8a6d72853970857f9b0cabdc29e5d6fbb915f2f7d688c
C:\WINDOWS\System32\AggregatorHost.exe 64aa037f7033a7b9701bddc8fa2f0aa34765d354eaec413719a3eeb466cfd703
C:\WINDOWS\System32\aitstatic.exe 3aa57252eed27c048e58a16d7f2e9e80e3c860e29af0e7c8cad1f95b082f5858
C:\WINDOWS\System32\alg.exe 268d5226f97813b3280b67ad3037c2aadd32bee89e319d »

Сделал так:
$report = @()
dir C:\windows\*.exe |% {
$obj = [pscustomobject]@{
Path = $_.fullname
Checksum = (& certutil.exe -hashfile $_.fullname sha256) -match 'for data' -replace '.*\s+' -as [string]
}
$report += $obj
}
все равно не взлетает. в 10 тоже

DJ Mogarych
30-12-2024, 08:54
Напишите правильно строку с Checksum, сейчас у вас одна половина из одного варианта, а вторая - из другого.

Uragan66
31-12-2024, 19:16
Самый простой вариант:

# Укажите путь к папке
$folderPath = "C:\MyFolder"

# Выберите алгоритм хеширования (MD5, SHA1, SHA256)
$hashAlgorithm = "SHA256"

# Получите список файлов в папке
$files = Get-ChildItem -Path $folderPath -File

# Переберите все файлы и вычислите контрольную сумму
foreach ($file in $files) {
# Вычислите контрольную сумму с помощью выбранного алгоритма
$hash = Get-FileHash -Algorithm $hashAlgorithm -Path $file.FullName

# Выведите информацию о файле и его контрольной сумме
Write-Host "Файл: $($file.Name)"
Write-Host "Контрольная сумма ($hashAlgorithm): $($hash.Hash)"
Write-Host ""
}

Кстати, скрипт писал ИИ. У себя проверил, работает.

DJ Mogarych
01-01-2025, 19:30
Uragan66, выше писали о том, что Get-FileHash недоступен на древних операционках.

Foreigner
03-01-2025, 10:14
-Path $file.FullName »

А просто $File, без Fullname не работает? Я уже забыл как это в Windows PowerShell (5.1), в 7+ путь берется сам, из объекта System.IO.FileInfo или DirectoryInfo.

DJ Mogarych
03-01-2025, 11:46
Foreigner, работает и в 5.1.

YuS_2
03-01-2025, 13:59
Get-FileHash недоступен на древних операционках. »
можно попробовать:
$hash = new-object System.Security.Cryptography.SHA256CryptoServiceProvider
$hash.computehash
но, это если ТС-у ещё нужно, до сих пор. :)

SQLai Lama
03-01-2025, 20:56
Прежде всего Get-FileHash является функцией, код которой вполне можно подсмотреть:
Get-Content function:Get-FileHash
Однако копировать её код, в надежде "портировать" под XP, идея заведомо обречённая на провал, так как PowerShell второй версии, которая является пределом для XP, отличается рантайм либой. Поэтому придётся писать нечто вроде:
$a = [Security.Cryptography.SHA256]::Create()
-join$a.ComputeHash([IO.File]::ReadAllBytes("$env:windir\explorer.exe")).ForEach{$_.ToString('x2')}
$a.Dispose()
К слову, Get-FileHash вполне обходится без циклов:
Get-FileHash "$([Environment]::SystemDirectory)\*.exe"

alexdomovoi
04-01-2025, 15:55
о, это если ТС-у ещё нужно, до сих пор. »
Спасибо! Мне все варианты нужны так как парк от XP до 10 поэтому по всем ОС собрать нужно.




© OSzone.net 2001-2012