使用Win32_FileSpecification WMI实例

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

  1. 它使用CheckID作为键,看上去与'\'改成'。'和最后一个GUID类似。 你如何从一个path(C:\ test.txt)获得这个CheckID格式(最好从CIM_DataFile)? GUID的意义是什么?
  2. 无论如何,运行gwmi WIN32_FileSpecification时,所有文件的输出中都有一个空的MD5Checksum值。 MD5Checksum应得到一个实例时由Windows填充,如果不是有一种方法来调用填充它? 看来WIN32_FileSpecification中的唯一方法是未实现的Invoke。

我唯一的解决scheme是使用远程编写PowerShell的cmdlet来运行脚本并生成校验和值。 这可以工作,但不是最干净的,因为在PowerShell中没有直接计算MD5的方法,所以需要额外维护代码。

谢谢!

在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编码值。

或者,如果您需要hex表示而不是散列的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"