Usando instâncias do WMI Win32_FileSpecification

1

Estou tentando obter uma soma de verificação de um arquivo remoto usando a classe Win32_FileSpecification via WMI, mas estou tendo alguns problemas.

  1. Ele usa CheckID como a chave, que parece ser semelhante ao caminho com '\' alterado para '.' e um GUID no final. Como você obtém de um caminho (C: \ test.txt) para este formato CheckID (preferencialmente de CIM_DataFile)? Qual é o significado do GUID?
  2. Independentemente do que precede, quando gwmi WIN32_FileSpecification é executado, todos os arquivos têm um valor vazio de MD5Checksum na saída. O MD5Checksum deve ser preenchido pelo Windows ao obter uma instância e, em caso negativo, existe um método para invocá-lo para preenchê-lo? Parece que o único método em WIN32_FileSpecification é Invoke, que não está implementado.

Minha única solução foi gravar um cmdlet para o PowerShell usando o remoting para executar um script e gerar o valor da soma de verificação. Isso funciona, mas não é o mais limpo, pois não há nenhuma maneira direta de calcular um MD5 no PowerShell, portanto, há manutenção adicional do código.

Obrigado!

    
por Brian 31.01.2012 / 14:23

1 resposta

1

there is no direct way to calculate an MD5 in PowerShell

Isso não é inteiramente verdade. Lembre-se de que o PowerShell tem acesso a toda a pilha .NET e certamente é possível calcular um hash MD5 no .NET.

Se o seu objetivo é obter um hash MD5, você pode evitar o WMI e usar algo assim:

$crypto = [System.Security.Cryptography.MD5]::Create()
$data = [System.IO.File]::ReadAllBytes("\path\to\file")
$md5 = [System.Convert]::ToBase64String($crypto.ComputeHash($data))

Em que md5 é um valor codificado em base64 do hash MD5.

Ou se você precisar de uma representação hexadecimal em vez de base64 do hash:

$md5 = [System.BitConverter]::ToString($crypto.ComputeHash($data)).Replace("-", "")

Você pode, claro, incluir isso em uma boa função do PowerShell:

Function MD5Hash
{
    param ($file)
    $crypto = [System.Security.Cryptography.MD5]::Create()
    $data = [System.IO.File]::ReadAllBytes($file)
    [System.BitConverter]::ToString($crypto.ComputeHash($data)).Replace("-", "")
}

E invoque da seguinte forma:

MD5Hash "\path\to\file"
    
por 31.01.2012 / 16:52