Назад | Перейти на главную страницу

Использование экземпляров WMI Win32_FileSpecification

Я пытаюсь получить контрольную сумму удаленного файла с помощью класса Win32_FileSpecification через WMI, но у меня возникли некоторые проблемы.

  1. Он использует CheckID в качестве ключа, который выглядит аналогично пути с '\' s изменено на '. И GUID в конце. Как перейти от пути (C: \ test.txt) к этому формату CheckID (желательно из CIM_DataFile)? Какое значение имеет GUID?
  2. Независимо от вышесказанного, когда 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"