Mangling Exchange GUIDs
I spent a good few hours today attempting to use the MailboxGUID returned from the WMI Exchange provider to search for the associated Active Directory account, using the msExchMailboxGuid attribute.
Here's two functions I came up with in the end. One to convert MailboxGUID to something that a search on msExchMailboxGuid will like:
sub exch_to_ad {
my $guid = shift;
$guid =~ s/[\{\}]+//g;
my $string = '';
my $count = 0;
foreach my $part ( split /\-/, $guid ) {
$count++;
if ( $count >= 4 ) {
$string .= "\\$_" for unpack "(A2)*", $part;
}
else {
$string .= "\\$_" for reverse unpack "(A2)*", $part;
}
}
return $string;
}
And another to take a msExchMailboxGuid field, which is a byte array, and convert it to a MailboxGUID.
sub ad_to_exch {
my $guid = shift;
my @vals = map { sprintf("%.2X", ord $_) } unpack "(a1)*", $guid;
my $string = '{';
$string .= join '', @vals[3,2,1,0], '-', @vals[5,4], '-',
@vals[7,6], '-', @vals[8,9], '-', @vals[10..$#vals], '}';
return $string;
}
Hopefully this should save other people some time.