= Powershell: Function: Get MD5 Hash =
**Summary**: A function to get the MD5 hash of various items and examples on how to use it \\
**Date**: Around 2013 \\
**Refactor**: 22 March 2025: Checked links and formatting. \\
{{tag>powershell}}
> It is based on [[https://github.com/Wintellect/WintellectPowerShell/blob/master/Code/Get-Hash.psm1|this script from WinTellect]].
== Function ==
First step is to create the Get-Hash.psm1 file. This can be a regular textfile and should contain the following lines:
<#
.SYNOPSIS
Gets the hash value
.DESCRIPTION
Gets the hash value of a file or string
It uses System.Security.Cryptography.HashAlgorithm (http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspx)
and FileStream Class (http://msdn.microsoft.com/en-us/library/system.io.filestream.aspx)
Written by Josep Martínez Vilà: http://dbadailystuff.com/2013/03/11/get-hash-a-powershell-hash-function/
Based on: http://blog.brianhartsock.com/2008/12/13/using-powershell-for-md5-checksums/ and some ideas on Microsoft Online Help
.PARAMETER File
File to get the hash from.
.PARAMETER Text
Text string to get the hash from
.PARAMETER Algorithm
Type of hash algorithm to use. Default is SHA1
.EXAMPLE
C:\PS> Get-Hash "myFile.txt"
Gets the SHA1 from myFile.txt file. When there's no explicit parameter, it uses -File
.EXAMPLE
Get-Hash -File "C:\temp\myFile.txt"
Gets the SHA1 from myFile.txt file
.EXAMPLE
C:\PS> Get-Hash -Algorithm "MD5" -Text "Hello Wold!"
Gets the MD5 from a string
.EXAMPLE
C:\PS> "Hello Wold!" | Get-Hash
We can pass a string throught the pipeline
#>
function Get-Hash
{
Param
(
[parameter(Mandatory=$true, ValueFromPipeline=$true, ParameterSetName="set1")]
[String]
$text,
[parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false, ParameterSetName="set2")]
[String]
$file = "",
[parameter(Mandatory=$false, ValueFromPipeline=$false)]
[ValidateSet("MD5", "SHA", "SHA1", "SHA-256", "SHA-384", "SHA-512")]
[String]
$algorithm = "SHA1"
)
Begin
{
$hashAlgorithm = [System.Security.Cryptography.HashAlgorithm]::Create($algorithm)
}
Process
{
$md5StringBuilder = New-Object System.Text.StringBuilder 50
$ue = New-Object System.Text.UTF8Encoding
if ($file){
try {
if (!(Test-Path $file)){
throw "Test-Path returned false."
}
}
catch {
throw "Get-Hash - File not found or without permisions: [$file]. $_"
}
try {
[System.IO.FileStream]$fileStream = [System.IO.File]::Open($file, [System.IO.FileMode]::Open);
$hashAlgorithm.ComputeHash($fileStream) | % { [void] $md5StringBuilder.Append($_.ToString("x2")) }
}
catch {
throw "Get-Hash - Error reading or hashing the file: [$file]"
}
finally {
$fileStream.Close()
$fileStream.Dispose()
}
}
else {
$hashAlgorithm.ComputeHash($ue.GetBytes($text)) | % { [void] $md5StringBuilder.Append($_.ToString("x2")) }
}
return $md5StringBuilder.ToString()
}
}
Now you can use it in your script by first importing the script as a module:
# Add Get-Hash function
Import-Module g:\scripts\get-hash.psm1
Now you can create a string, for example based on the VM name with an extra string:
$stringtohash = $vm.toUpper() + "-go4shift"
$guestpw = (Get-Hash -Algorithm "MD5" -text $stringtohash)
or like this to add extra parameters after hashing:
$guestpw = (Get-Hash -Algorithm "MD5" -text $stringtohash) + "!!!"
Now you can use the password like you would normally do, for example when using the {{{Copy-VMGuestFile}}} commandlet:
Copy-VMGuestFile -Source $scriptlocation\$script -Destination $guestdir -Force -VM $vm -LocalToGuest -HostUser root -HostPassword $hostpw -GuestUser Administrator -GuestPassword $guestpw
{{tag>vmware scripts security}}