Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Массовое определение контрольных сумм файлов

Ответить
Настройки темы
PowerShell - Массовое определение контрольных сумм файлов

Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


Добрый день! Хочу в папке 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" не распознано как имя командлета, функции, файла скрипт
а или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего пов
торите попытку.
Подскажите, что подправить, что бы взлетело? Спасибо!

Отправлено: 13:19, 28-12-2024

 

Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


Я же правильно понимаю если для XP сделать, то и на 7 взлетит?

Отправлено: 16:36, 04-01-2025 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1231
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата alexdomovoi:
правильно понимаю если для 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
- в функцию передавайте пути к файлам, лучше абсолютные... в общем, разберетесь.

-------
scio me nihil scire. Ѫ


Отправлено: 18:19, 04-01-2025 | #22


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6679
Благодарности: 1560

Профиль | Отправить PM | Цитировать


Реально проверил на 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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 04-01-2025 в 20:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:26, 04-01-2025 | #23


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1231
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
выдаёт ошибки »
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()
}

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:48, 05-01-2025 | #24


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6679
Благодарности: 1560

Профиль | Отправить PM | Цитировать


Да, так работает.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 05:54, 05-01-2025 | #25


Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg powersh_2.JPG
(108.5 Kb, 5 просмотров)

Цитата DJ Mogarych:
$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 дает, а в подпапках как?
Спасибо!

Отправлено: 16:29, 05-01-2025 | #26


Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg powersh_3.JPG
(103.2 Kb, 5 просмотров)

проверяю SHA 256
а суммы у файлов разные......

Отправлено: 16:40, 05-01-2025 | #27


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1231
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата alexdomovoi:
единственное подскажите как этот результат сразу в файл загнать? »
Цитата alexdomovoi:
так что бы он не только в папке system32 но и в подпапках всех сразу собрал по маске контрольные суммы и выдал с путями их полными. а то он только в system32 exe дает, а в подпапках как? »
Цитата alexdomovoi:
суммы у файлов разные »
Код: Выделить весь код
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

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 08-01-2025 в 22:28. Причина: поправлен код для корректной работы get-fhash $_ -> get-fhash $_.fullname + ещё правка для рекурсии

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:02, 05-01-2025 | #28


Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg powersh_4.JPG
(55.8 Kb, 2 просмотров)

Цитата 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 »
тишина какая то, или неправильно что то делаю?

Последний раз редактировалось alexdomovoi, 06-01-2025 в 13:55.


Отправлено: 11:46, 06-01-2025 | #29


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1231
Благодарности: 515

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ


Отправлено: 14:49, 06-01-2025 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Массовое определение контрольных сумм файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Массовое переименование файлов Super_Kolobok Скриптовые языки администрирования Windows 4 19-05-2024 16:28
Программы для сверки контрольных сумм KaSpieC 666 Хочу все знать 17 16-12-2014 18:39
CMD/BAT - Сравнение контрольных сумм md5 vodka Скриптовые языки администрирования Windows 11 09-01-2013 07:11
Прочие - Программы для подсчёта контрольных сумм файлов ALEXEY_DFD Программное обеспечение Windows 14 18-11-2011 15:30
C/C++ - Получение контрольных сумм файлов (MD5, и т.д.) и их проверка в Online-сервисах Drongo Программирование и базы данных 49 30-08-2010 18:39




 
Переход