Войти

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


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

alexdomovoi
04-01-2025, 16:36
Я же правильно понимаю если для XP сделать, то и на 7 взлетит?

YuS_2
04-01-2025, 18:19
правильно понимаю если для XP сделать, то и на 7 взлетит? »
да... Вы бы уже просто попробовали :)
Вот, функция:
function get-fhash($x){
$hash = new-object Security.Cryptography.SHA256CryptoServiceProvider
$file = gi $x
$stream = $file.openread()
$strb = new-object Text.StringBuilder
foreach($byte in $hash.computehash($stream)){
$null = $strb.append($byte.tostring('x2'))
}
$stream.close()
return $strb.tostring()
}

$f = '.\explorer.exe'
get-fhash $f
- в функцию передавайте пути к файлам, лучше абсолютные... в общем, разберетесь.

DJ Mogarych
04-01-2025, 20:26
Реально проверил на Windows XP sp3.
Там отсутствует certutil.exe в стандартной поставке, а на

$hash = new-object Security.Cryptography.SHA256CryptoServiceProvider

выдаёт ошибки

New-Object : Исключение при вызове ".ctor" с "0" аргументами: "The specified cryptographic algorithm is not supported on this platform."
строка:1 знак:11
+ new-object <<<< System.Security.Cryptography.SHA256CryptoServiceProvider
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

или

New-Object : Не удается найти тип [System.Security.Cryptography.SHA256CryptoServiceProvider]: убедитесь в том, что сборка, содержащая этот тип, загружена.
строка:4 знак:19
+ $hash = new-object <<<< System.Security.Cryptography.SHA256CryptoServiceProvider
+ CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand


Заработало 2 варианта - с 7-zip

$7z = 'C:\Program Files\7-Zip\7z.exe'
$report = @()

dir $env:windir\system32\*.exe |% {
$props = @{
Path = $_.fullname
Checksum = (& $7z h -scrcsha256 $_.fullname) -match 'for data' -replace '.*\s+' -as [string]
}
$obj = New-Object -TypeName PSObject -Property $props
$report += $obj
}

$report


И без

$report = @()

dir $env:windir\system32\*.exe |% {
$a = [Security.Cryptography.SHA256]::Create()
$props = @{
Path = $_.fullname
Checksum = ($a.ComputeHash([IO.File]::ReadAllBytes("$($_.fullname)")) |% {$_.ToString('x2')}) -join ''
}
$obj = New-Object -TypeName PSObject -Property $props
$report += $obj
}

$report

YuS_2
05-01-2025, 00:48
выдаёт ошибки »
XP у меня нет, проверять нечем...
Но если работает:
[Security.Cryptography.SHA256]
то функция может быть такой:
function get-fhash($x){
$hash = [security.cryptography.sha256]::create()
$file = gi $x
$stream = $file.openread()
$strb = new-object Text.StringBuilder
foreach($byte in $hash.computehash($stream)){
$null = $strb.append($byte.tostring('x2'))
}
$stream.close()
return $strb.tostring()
}

DJ Mogarych
05-01-2025, 05:54
Да, так работает.

alexdomovoi
05-01-2025, 16:29
$report = @()
dir $env:windir\system32\*.exe |% {
$a = [Security.Cryptography.SHA256]::Create()
$props = @{
Path = $_.fullname
Checksum = ($a.ComputeHash([IO.File]::ReadAllBytes("$($_.fullname)")) |% {$_.ToString('x2')}) -join ''
}
$obj = New-Object -TypeName PSObject -Property $props
$report += $obj
}
$report »
вот этот вариант заработал на xp и 7
единственное подскажите как этот результат сразу в файл загнать?
а так что бы он не только в папке system32 но и в подпапках всех сразу собрал по маске контрольные суммы и выдал с путями их полными. а то он только в system32 exe дает, а в подпапках как?
Спасибо!

alexdomovoi
05-01-2025, 16:40
проверяю SHA 256
а суммы у файлов разные......

YuS_2
05-01-2025, 19:02
единственное подскажите как этот результат сразу в файл загнать? »
так что бы он не только в папке system32 но и в подпапках всех сразу собрал по маске контрольные суммы и выдал с путями их полными. а то он только в system32 exe дает, а в подпапках как? »
суммы у файлов разные »
function get-fhash($x){
$hash = [security.cryptography.sha256]::create()
$file = gi $x
$stream = $file.openread()
$strb = new-object Text.StringBuilder
foreach($byte in $hash.computehash($stream)){
$null = $strb.append($byte.tostring('x2'))
}
$stream.close()
return $strb.tostring()
}

dir $env:windir\system32 -rec -filt "*.exe"|%{
new-object PSObject -Property @{Path = $_.fullname;SHA256 = get-fhash $_.fullname}
} |convertto-csv -notyp |out-file out.csv -enc utf8

alexdomovoi
06-01-2025, 11:46
Цитата YuS_2:
function get-fhash($x){
$hash = [security.cryptography.sha256]::create()
$file = gi $x
$stream = $file.openread()
$strb = new-object Text.StringBuilder
foreach($byte in $hash.computehash($stream)){
$null = $strb.append($byte.tostring('x2'))
}
$stream.close()
return $strb.tostring()
}
dir $env:windir\system32\*.exe -rec|%{
new-object PSObject -Property @{Path = $_.fullname;SHA256 = get-fhash $_}
} |convertto-csv -notyp |out-file out.csv -enc utf8 »
тишина какая то, или неправильно что то делаю?

YuS_2
06-01-2025, 14:49
тишина какая то »
файл же надо поискать :)
вот же, это Вы писали:
подскажите как этот результат сразу в файл загнать? »
?
- так вот и надо теперь искать файл:
out-file out.csv -enc utf8 »

alexdomovoi
06-01-2025, 19:08
А там может путь к файлу прописать?

YuS_2
06-01-2025, 20:42
может путь к файлу прописать? »
можно и прописать... можно и рядом со скриптом его поискать... тут уж, чего больше душа пожелает...

alexdomovoi
07-01-2025, 04:37
Цитата YuS_2:
можно и прописать... можно и рядом со скриптом его поискать... тут уж, чего больше душа пожелает... »
Да, спасибо с файлом разобрался, подскажите, а нельзя сюда применить из первого сообщения
$files = Get-ChildItem -Path $FolderPath -Recurse -Filter *.exe что бы собирались данные по exe из всех подпапок тоже?
по хешу разному разобрался утилита certutil дает хеш тот который дает и скрипт, а вот почему 7zip дает другой при выборе SHA256 непонятно ну и ладно, у меня 7zip в системе нет.

YuS_2
07-01-2025, 12:29
нельзя сюда применить из первого сообщения »
да, можно, конечно.

что бы собирались данные по exe из всех подпапок тоже? »
на это влияет параметр -Recurse командлета Get-ChildItem, который в моем варианте также присутствует. Вы ведь можете увидеть, что в файле присутствуют пути к файлам из подкаталогов... то бишь, разницы никакой нет, ещё и экономия памяти в моем варианте...
Но если хочется, то проблем никаких нет:
param (
[string]$FolderPath, # c:\windows
[string]$LogFile = "c:\1\checksums.log"
)
if (-Not (Test-Path $FolderPath))
{
Write-Host "Путь не найден: $FolderPath"
exit
}

function get-fhash($x){
$hash = [security.cryptography.sha256]::create()
$file = gi $x
$stream = $file.openread()
$strb = new-object Text.StringBuilder
foreach($byte in $hash.computehash($stream)){
$null = $strb.append($byte.tostring('x2'))
}
$stream.close()
return $strb.tostring()
}

$files = dir $FolderPath -rec -filt "*.exe"

$files|%{
new-object PSObject -Property @{Path = $_.fullname;SHA256 = get-fhash $_.fullname}
} |convertto-csv -notyp|out-file $LogFile -enc utf8

alexdomovoi
08-01-2025, 10:46
Резюмирую:
Проверил на XP-7 PowerShell 2.0

param (
[string]$FolderPath, # c:\windows
[string]$LogFile = "c:\1\checksums.log"
)
if (-Not (Test-Path $FolderPath))
{
Write-Host "Путь не найден: $FolderPath"
exit
}

function get-fhash($x){
$hash = [security.cryptography.sha256]::create()
$file = gi $x
$stream = $file.openread()
$strb = new-object Text.StringBuilder
foreach($byte in $hash.computehash($stream)){
$null = $strb.append($byte.tostring('x2'))
}
$stream.close()
return $strb.tostring()
}

$files = dir $FolderPath -rec -filt "*.exe"

$files|%{
new-object PSObject -Property @{Path = $_.fullname;SHA256 = get-fhash $_.fullname}
} |convertto-csv -notyp|out-file $LogFile -enc utf8
выдает ошибку Test-Path : Не удается привязать аргумент к параметру "Path", так как он представляет собой пустую строку.
строка:5 знак:20
+ if (-Not (Test-Path <<<< $FolderPath))
+ CategoryInfo : InvalidData: (:) [Test-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Test
PathCommand
но отрабатывает файлы exe вместе с подпапками.

вот этот вариант на XP-7 PowerShell 2.0:
function get-fhash($x){
$hash = [security.cryptography.sha256]::create()
$file = gi $x
$stream = $file.openread()
$strb = new-object Text.StringBuilder
foreach($byte in $hash.computehash($stream)){
$null = $strb.append($byte.tostring('x2'))
}
$stream.close()
return $strb.tostring()
}

dir $env:windir\system32\*.exe -rec|%{
new-object PSObject -Property @{Path = $_.fullname;SHA256 = get-fhash $_.fullname}
} |convertto-csv -notyp |out-file c:\1\out.csv -enc utf8
отрабатывает без ошибки, но при этом отрабатывает exe только в одной папке в которой я запускаю данный скрипт без подпапок (windir\system32).

YuS_2
08-01-2025, 15:04
выдает ошибку »
Ну так надо дать ему то, чего скрипт хочет... путь к каталогу в виде параметра к скрипту... ну, или указать его здесь:
[string]$FolderPath, # c:\windows »
например, так:
param (
[string]$FolderPath = "c:\windows", # c:\windows
[string]$LogFile = "c:\1\checksums.log"
)
...
- если скрипт предполагаете запускать без параметров

отрабатывает без ошибки, но при этом отрабатывает exe только в одной папке в которой я запускаю данный скрипт без подпапок (windir\system32). »
Этого просто не может быть... я его проверял на Win 7, где ps 2.0
Так он мог себя вести до того, как я его поправлял... если там в коде вызов функции был таким:
...get-fhash $_}
а не как сейчас:
...get-fhash $_.fullname}

alexdomovoi
08-01-2025, 19:39
Этого просто не может быть... я его проверял на Win 7, где ps 2.0 »
скрин исполнения и результата прилагаю

YuS_2
08-01-2025, 22:23
скрин исполнения и результата прилагаю »
А, да... точно. Не обратил внимания, что подкаталогов нет. Параметр Recurse претерпел изменения с версии PS 3.0, а для PS 2.0 было так:
Параметр Recurse работает только в том случае, если путь указывает на контейнер с дочерними элементами, на
пример "C:\Windows" или "C:\Windows\*", и не работает, если путь указывает на элементы без дочерних элемен
тов, например "C:\Windows\*.exe".
так что да, необходимо поменять было эту комбинацию. Вот это:
dir $env:windir\system32\*.exe -rec
- надо поменять на это:
dir $env:windir\system32 -rec -filt "*.exe"

Ну или использовать тот последний вариант скрипта, где путь к каталогу можно указывать в качестве параметра скрипта.




© OSzone.net 2001-2012