The objectGUID attribute is a little tricky to work with, especially if you want to use it as part of an LDAP filter. This is because the value in stored within the directory as an octet string – essentially an array of one-byte characters. This syntax is not especially user-friendly, which is why it is typically displayed (by tools such as LDP.EXE and the AD Powershell cmdlets) in a registry string format, e.g. “af97d4c7-5f17-4ce2-9245-687d410b4b20”. Another way of displaying the value is using a hex string format, e.g. “C7D497AF175FE24C9245687D410B4B20”. If you’re into migrations using Quest Migration Manager for AD, the hex string representation is used for the matching attribute value (using either extenstionAttribute15 or adminDisplayName). As you can see, the two representations are similar, but have a slightly different ordering of the bytes.
You’d think that you would be able to use one of these two string representations of the objectGUID as part of an LDAP search filter, wouldn’t you? Well, no, that would be too helpful. Instead, you need a slightly modified version of the hex string, i.e. “\C7\D4\97\AF\17\5F\E2\4C\92\45\68\7D\41\0B\4B\20”. The search filter syntax would look like this “(objectGUID=\C7\D4\97\AF\17\5F\E2\4C\92\45\68\7D\41\0B\4B\20)”
The script below accepts either of the two string formats as input and prompts you for the naming context in which to search for the object represented by the objectGUID attribute.
######################################################### # # Name: Get-ADObjectFromGUID.ps1 # Author: Tony Murray # Version: 1.0 # Date: 24/08/2010 # Comment: PowerShell script to search for an AD object # using 'objectGUID' as the LDAP search filter # ######################################################### # Import the AD module ipmo ActiveDirectory # Get the objectGUID value $Input1 = @' Please enter the objectGUID value in one of the two following formats: Registry string format, e.g. bb67681f-0ac1-471a-bf3d-f7f4c4cb1290 or Hex string format, e.g. 455E54E9D58B0F4B8F389E4982791D40 '@ $strGUID = Read-Host $Input1 # Present Menu [string] $menu = @' Choose the AD partition to search within 1. Current Domain 2. Configuration 3. Schema 4. Other '@ $a = Read-Host $menu switch ($a) { 1 { $SearchBase = (Get-ADRootDSE).defaultNamingContext } 2 { $SearchBase = (Get-ADRootDSE).configurationNamingContext } 3 { $SearchBase = (Get-ADRootDSE).schemaNamingContext } 4 { $SearchBase = Read-Host "Enter the search base: " } } if ($strGUID.length -eq 36) { # We have a string in registry format and need to convert it to Hex string $strHex = -join (([guid]$strGUID).tobytearray() | %{$_.tostring("X").padleft(2,"0")}) } elseif ($strGUID.length -eq 32) { # We have a string in Hex format - no need to modify $strHex = $strGUID } else { # Unrecognised string format Write-host "Unrecognised string format - remove any leading or trailing spaces and try again" Break } # We need to modify the Hex string to allow it to be used as a filter $strSearch = $strHex -replace '(..)','\$1' # Go ahead and search for the object Get-ADObject -LDAPFilter "(objectGUID=$strSearch)" -SearchBase $SearchBase -Properties * | fl # End
You can download the script here: get-adobjectfromguid.zip
Or just use adfind with the -binenc switch and specify the GUID as its normal string format within {{GUID=blah}}. 😉
You can actually do a search for the GUID matching string in a Quest migration.
Simply do an LDAP filter/custom search with the following syntax. Copy the matching attribute value and paste into the section specified.
(distinguishedname=<GUID=HEXSTRING>)
This will return the required object as expected. This would work if you have the HEX string representation even if you aren’t doing a Quest migration of course 🙂
@joe. Adfind has always been one step ahead 🙂
@Jason. That is very cool. I wasn’t aware of that. It also works if you use the registry string syntax, e.g.
(distinguishedname=<GUID=bb67681f-0ac1-471a-bf3d-f7f4c4cb1290>)
Pingback: How to search for an ObjectGUID Hex String in Active Directory : IOCON Solutions
Excellent script, appreciate the time writing it! thanks!