Я пытаюсь получить контрольную сумму удаленного файла с помощью класса Win32_FileSpecification через WMI, но у меня возникли некоторые проблемы.
gwmi WIN32_FileSpecification
выполняется, все файлы имеют пустое значение MD5Checksum на выходе. Должна ли Windows заполняться MD5Checksum при получении экземпляра, а если нет, есть ли метод для его заполнения? Похоже, что единственный метод в WIN32_FileSpecification - это Invoke, который не реализован.Моим единственным решением было написать командлет для PowerShell с использованием удаленного взаимодействия для запуска сценария и генерации значения контрольной суммы. Это работает, но не самый чистый, поскольку нет прямого способа вычислить MD5 в PowerShell, поэтому требуется дополнительное обслуживание кода.
Спасибо!
нет прямого способа вычислить MD5 в PowerShell
Это не совсем так. Помните, что PowerShell имеет доступ ко всему стеку .NET, и, безусловно, можно вычислить хэш MD5 в .NET.
Если ваша цель - получить хеш MD5, вы можете полностью отказаться от WMI и использовать что-то вроде этого:
$crypto = [System.Security.Cryptography.MD5]::Create()
$data = [System.IO.File]::ReadAllBytes("\\path\to\file")
$md5 = [System.Convert]::ToBase64String($crypto.ComputeHash($data))
куда md5
- значение хэша MD5 в кодировке base64.
Или, если вам нужно шестнадцатеричное представление вместо base64 хеша:
$md5 = [System.BitConverter]::ToString($crypto.ComputeHash($data)).Replace("-", "")
Вы, конечно, можете заключить это в небольшую симпатичную функцию PowerShell:
Function MD5Hash
{
param ($file)
$crypto = [System.Security.Cryptography.MD5]::Create()
$data = [System.IO.File]::ReadAllBytes($file)
[System.BitConverter]::ToString($crypto.ComputeHash($data)).Replace("-", "")
}
И вызываем так:
MD5Hash "\\path\to\file"