![使用 Win32_FileSpecification WMI 实例](https://linux22.com/image/574181/%E4%BD%BF%E7%94%A8%20Win32_FileSpecification%20WMI%20%E5%AE%9E%E4%BE%8B.png)
我正在尝试通过 WMI 使用 Win32_FileSpecification 类获取远程文件的校验和,但遇到了一些问题。
- 它使用 CheckID 作为密钥,看起来类似于将“\”改为“。”并在末尾添加 GUID 的路径。如何从路径 (C:\test.txt) 转换为此 CheckID 格式(最好从 CIM_DataFile 转换)?GUID 的意义是什么?
- 不管上述内容如何,
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"