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

Компьютерный форум 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

 

(*.*)


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

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


DJ Mogarych, значит исправили

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 19:54, 29-12-2024 | #11



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

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


Старожил


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

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


Цитата DJ Mogarych:
И в нижнем работает:
Код: Выделить весь код
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 тоже

Отправлено: 02:31, 30-12-2024 | #12


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

fascinating rhythm


Moderator


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

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


Напишите правильно строку с Checksum, сейчас у вас одна половина из одного варианта, а вторая - из другого.

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


Отправлено: 08:54, 30-12-2024 | #13


Старожил


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

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


Самый простой вариант:

Код: Выделить весь код
# Укажите путь к папке
$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 ""
}
Кстати, скрипт писал ИИ. У себя проверил, работает.

Отправлено: 19:16, 31-12-2024 | #14


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

fascinating rhythm


Moderator


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

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


Uragan66, выше писали о том, что Get-FileHash недоступен на древних операционках.

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

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

Отправлено: 19:30, 01-01-2025 | #15


Ветеран


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

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


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

Отправлено: 10:14, 03-01-2025 | #16


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

fascinating rhythm


Moderator


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

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


Foreigner, работает и в 5.1.

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

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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата DJ Mogarych:
Get-FileHash недоступен на древних операционках. »
можно попробовать:
Код: Выделить весь код
$hash = new-object System.Security.Cryptography.SHA256CryptoServiceProvider
$hash.computehash
но, это если ТС-у ещё нужно, до сих пор.

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


Отправлено: 13:59, 03-01-2025 | #18


Новый участник


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

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


Прежде всего 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"
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:56, 03-01-2025 | #19


Старожил


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

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


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

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



Компьютерный форум 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




 
Переход