Ich würde gerne eine MD5 Prüfsumme eines Inhalts berechnen. Wie mache ich das in PowerShell?Wie bekomme ich eine MD5-Prüfsumme in PowerShell
Antwort
Wenn der Inhalt eine Zeichenfolge ist:
$someString = "Hello World!"
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$utf8 = new-object -TypeName System.Text.UTF8Encoding
$hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($someString)))
Wenn der Inhalt eine Datei:
$someFilePath = "C:\foo.txt"
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath)))
Ab PowerShell ve rsion 4, das ist einfach für Dateien aus der Box mit dem Get-FileHash
Cmdlets zu tun:
Get-FileHash <filepath> -Algorithm MD5
Dies ist sicherlich vorzuziehen, da es die Probleme, die erste Lösung vermeidet, wie in den Kommentaren (verwendet einen Stream identifiziert bietet, schließt es und unterstützt große Dateien).
'Exception ruft" ReadAllBytes "mit" 1 "Argument (en) auf:" Die Datei ist zu lang. Diese Operation ist zur Zeit auf die Unterstützung von Dateien mit weniger als 2 Gigabyte begrenzt. "'Als Linux-Neuling bei Powershell,' Ich bin sehr verärgert über die Kämpfe, die ich habe, um eine MD5-Summe zu bekommen, die unter Linux einfach 'md5sum file.ext' wäre. – StockB
@StockB Keiths Antwort wird wahrscheinlich besser damit umgehen. Ich stimme zu, es gibt einige Mängel mit Powershell. – vcsjones
Ich habe Vanille PowerShell installiert, ohne Erweiterungen, also habe ich einen Befehlszeilen-md5sum-Klon statt dessen heruntergeladen und heruntergeladen, was gut funktioniert. Ich möchte Microsofts Sachen mögen, aber ich kann es einfach nicht. – StockB
Diese Site hat ein Beispiel: http://blog.brianhartsock.com/2008/12/13/using-powershell-for-md5-checksums/. Es verwendet das .NET-Framework, um eine Instanz des MD5-Hashalgorithmus zur Berechnung des Hash zu instanziieren.
Hier ist der Code aus dem Artikel, Stephen Kommentar enthält:
param
(
$file
)
$algo = [System.Security.Cryptography.HashAlgorithm]::Create("MD5")
$stream = New-Object System.IO.FileStream($Path, [System.IO.FileMode]::Open,
[System.IO.FileAccess]::Read)
$md5StringBuilder = New-Object System.Text.StringBuilder
$algo.ComputeHash($stream) | % { [void] $md5StringBuilder.Append($_.ToString("x2")) }
$md5StringBuilder.ToString()
$stream.Dispose()
Gut, außer es funktioniert nicht für Readonly-Dateien! Es benötigt $ stream = New-Objekt System.IO.FileStream ($ Pfad, [System.IO.FileMode] :: Öffnen, [System.IO.FileAccess] :: Lesen) –
Wenn der Link jemals stirbt, wird die Antwort ganz nutzlos sein. http://StackOverflow.com/Help/how-to-answer –
Als Reaktion auf was ich vermutet war Ihr Downvote, habe ich den Code aus dem Artikel hier ausgeschnitten und eingefügt. Das habe ich letztes Jahr nicht gemacht, weil ich das als Plagiat empfand. Durch Stephen's Read-Only-Anpassung hatte ich das Gefühl, dass es sich lohnt, etwas zu veröffentlichen. – neontapir
Hier sind die beiden Linien, gerade ändern "Hallo" in Zeile # 2:
PS C:\> [Reflection.Assembly]::LoadWithPartialName("System.Web")
PS C:\> [System.Web.Security.FormsAuthentication]::HashPasswordForStoringInConfigFile("hello", "MD5")
Das Ergebnis entspricht nicht der Ausgabe, die ich mit der akzeptierten Antwort erhalte.Es berechnet den Hash der STRING "Hallo", nicht von einer Datei, die durch einen Pfad definiert wäre, die ich "Hallo" durch ersetzen, richtig? – RobertG
Wenn Sie die PowerShell Community Extensions verwenden ein Get-Hash ist Commandlet, die dies leicht tun:
C:\PS> "hello world" | Get-Hash -Algorithm MD5
Algorithm: MD5
Path :
HashString : E42B054623B3799CB71F0883900F2764
+1: Sehr nett! Ich wusste nichts davon. – vcsjones
+1: Sa-weeeeeeet !! – D3vtr0n
Get-Hash kommt von PowerShell Community Extensions. Wenn Sie das Paket nicht verwenden können oder wollen, haben Sie in der Vanilla PowerShell 4.0 ein Cmdlet 'Get-FileHash 'hinzugefügt. Vide [TechNet] (http://technet.microsoft.com/en-us/library/dn520872.aspx). –
Es gibt viele Beispiele online mit ComputeHash(). Meine Tests haben gezeigt, dass dies sehr langsam war, wenn Sie über eine Netzwerkverbindung laufen. Das Snippet unten läuft viel schneller für mich, aber YMMV:
$md5 = [System.Security.Cryptography.MD5]::Create("MD5")
$fd = [System.IO.File]::OpenRead($file)
$buf = new-object byte[] (1024*1024*8) # 8mb buffer
while (($read_len = $fd.Read($buf,0,$buf.length)) -eq $buf.length){
$total += $buf.length
$md5.TransformBlock($buf,$offset,$buf.length,$buf,$offset)
write-progress -Activity "Hashing File" `
-Status $file -percentComplete ($total/$fd.length * 100)
}
# finalize the last read
$md5.TransformFinalBlock($buf,0,$read_len)
$hash = $md5.Hash
# convert hash bytes to hex formatted string
$hash | foreach { $hash_txt += $_.ToString("x2") }
write-host $hash_txt
Ihre Methode überwindet die 2Gb-Grenze von ReadAllBytes von anderen Antworten, was genau das ist, was ich brauchte. – Jay
Was macht der Backtick auf der Zeile 'write-progress'? Der Syntax Highlighter scheint es nicht zu mögen. – mwfearnley
@mwfearnley Der Backtick aktiviert die Zeilenfortsetzung. https://blogs.technet.microsoft.com/heyscriptingguy/2015/06/19/powertip-line-continuation-in-powershell/ – cmcginty
Hier ist eine Funktion, die ich verwende, die Griffe relative und absolute Pfade:
function md5hash($path)
{
$fullPath = Resolve-Path $path
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$file = [System.IO.File]::Open($fullPath,[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
try {
[System.BitConverter]::ToString($md5.ComputeHash($file))
} finally {
$file.Dispose()
}
}
Dank oben für den Vorschlag @davor öffnen zu verwenden () anstelle von ReadAllBytes() und nach @ jpmc26 für den Vorschlag, einen finally-Block zu verwenden.
Dieser Ansatz ist IMHO besser als vcsjones und Keith, weil es die Eingabe von Dateien größer als nehmen kann 2GB und es benötigt keine Erweiterungen oder PowerShell 4.0. –
Der 'Dispose'-Aufruf sollte in einem 'finally'-Block stehen. – jpmc26
Dies wird einen MD5-Hash für eine Datei auf einem Remote-Computer zurück:
Invoke-Command -ComputerName RemoteComputerName -ScriptBlock {
$fullPath = Resolve-Path 'c:\Program Files\Internet Explorer\iexplore.exe'
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$file = [System.IO.File]::OpenRead($fullPath)
$hash = [System.BitConverter]::ToString($md5.ComputeHash($file))
$hash -replace "-", ""
$file.Dispose()
}
Dies wird zu einem Einzeiler, wenn Sie FCIV von Microsoft herunterladen.
Heruntergeladene Microsofts Datei Checksum Integrity Verifier von hier https://support.microsoft.com/en-us/kb/841290
Führen Sie den folgenden Befehl ein. Ich musste zehn Dateien überprüfen.
gci WTAM*.tar | % {.\fciv $_.Name}
Beispiel für Rechtsklick-Menü-Option auch:
[HKEY_CLASSES_ROOT\*\shell\SHA1 PS check\command]
@="C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -NoExit -Command get-filehash -algorithm SHA1 '%1'"
Diese Frage ist fast 3 Jahre alt, seitdem, wie es einige kommentierte ein wich Get-FileHash Funktion ist sehr praktisch, .
PS C:\> Get-FileHash C:\Users\Andris\Downloads\Contoso8_1_ENT.iso -Algorithm SHA384 | Format-List
Algorithm : SHA384
Hash : 20AB1C2EE19FC96A7C66E33917D191A24E3CE9DAC99DB7C786ACCE31E559144FEAFC695C58E508E2EBBC9D3C96F21FA3
Path : C:\Users\Andris\Downloads\Contoso8_1_ENT.iso
Ändern Sie einfach SHA384 mit MD5.
The example is from the official documentation of PowerShell 5.1.
Ich denke, diese Antwort ist überflüssig von keith-Hill-Antwort und die Ausgabe der gewählten Antwort, aber es zeigt auf offizielle Dokumentation und es hat ein besseres Beispiel. Die Dokumentation enthält mehr Beispiele.
Was ist "etwas Inhalt"? eine Datei? Schnur? – vcsjones