使用 Win32_FileSpecification WMI 实例

使用 Win32_FileSpecification WMI 实例

我正在尝试通过 WMI 使用 Win32_FileSpecification 类获取远程文件的校验和,但遇到了一些问题。

  1. 它使用 CheckID 作为密钥,看起来类似于将“\”改为“。”并在末尾添加 GUID 的路径。如何从路径 (C:\test.txt) 转换为此 CheckID 格式(最好从 CIM_DataFile 转换)?GUID 的意义是什么?
  2. 不管上述内容如何,gwmi WIN32_FileSpecification​​运行时,所有文件的输出中都有一个空的 MD5Checksum 值。获取实例时,Windows 是否应该填充 MD5Checksum?如果没有,是否有方法可以调用来填充它?看来 WIN32_FileSpecification 上的唯一方法是 Invoke,但尚未实现。

我唯一的解决方案是使用远程处理为 PowerShell 编写一个 cmdlet 来运行脚本并生成校验和值。这种方法可行,但不是最简单的方法,因为在 PowerShell 中没有直接计算 MD5 的方法,因此需要对代码进行额外的维护。

谢谢!

答案1

在 PowerShell 中没有直接计算 MD5 的方法

这不完全正确。请记住,PowerShell 可以访问整个 .NET 堆栈,并且完全可以在 .NET 中计算 MD5 哈希值。

如果您的目标是获取 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"

相关内容