Win32::MailboxGUID - functions to convert Exchange mailbox GUIDs
version 0.02
# Example that requires Win32::OLE, DBI, DBD::ADO and administrative permissions # invoked with a list of Exchange servers on the command line to query # Use of 'exch_to_ad' use strict; use warnings; use Win32::OLE qw(in); use Win32::MailboxGUID qw[exch_to_ad]; use DBI; $|=1; my %limitinfo = ( '1', 'Below Limit', '2', 'Issue Warning', '4', 'Prohibit Send', '8', 'No Checking', '16', 'Mailbox Disabled', ); my $Root = Win32::OLE-> GetObject("LDAP://RootDSE"); my $DefaultDomainNC = $Root-> Get("DefaultNamingContext"); my $dsn = "Provider=ADsDSOObject;ConnectionString=$DefaultDomainNC"; my ($usr,$pwd); my $att = { }; my $dbi = DBI->connect("dbi:ADO:$dsn", $usr, $pwd, $att ) or die $DBI::errstr; OUTER: foreach my $server ( @ARGV ) { my $object = Win32::OLE->GetObject("winmgmts:{impersonationLevel=impersonate}!//$server/root/MicrosoftExchangeV2"); next OUTER unless $object; INNER: foreach my $mailbox ( in $object->InstancesOf("Exchange_Mailbox") ) { # Look up the quota info from the user account in AD my $mbguid = $mailbox->{MailboxGUID}; my @quotas = _find_user( $dbi, $mbguid ); my $limit = defined $mailbox->{StorageLimitInfo} && $limitinfo{ $mailbox->{StorageLimitInfo} } ? $limitinfo{ $mailbox->{StorageLimitInfo} } : ''; print join ',', $mailbox->{MailboxDisplayName}, $mailbox->{Size}, @quotas, $limit, $mailbox->{ServerName}, $mailbox->{TotalItems} || 0; print "\n"; } } } exit 0; sub _find_user { my $dbh = shift; my $guid = exch_to_ad( shift ); # convert the GUID Exchange to AD $guid = $dbi->quote( $guid ); my $sth = $dbi->prepare(qq{ select AdsPath FROM 'LDAP://$DefaultDomainNC' WHERE msExchMailboxGuid = $guid }) or die "Error $DBI::err ($DBI::errstr)\n"; $sth->execute() or die "Error $DBI::err ($DBI::errstr)\n"; while ( my $hashref = $sth->fetchrow_hashref ) { my $object = Win32::OLE->GetObject($hashref->{AdsPath}); next unless $object; if ( $object->{mDBUseDefaults} ) { return ( 'defaults', 'defaults', 'defaults' ); } else { return map { $object->{$_} } qw(mDBStorageQuota mDBOverQuotaLimit mDBOverHardQuotaLimit); } } return ('orphaned','orphaned','orphaned'); }
Active Directory and Exchange Server use a GUID to link a user account to a mailbox. Unfortunately, both these beasts cannot agree on the storage/presentation format of the GUID.
Retrieving user objects from Active Directory with ADSI, the msExchMailboxGuid is in a byte array format, which can be represented as:
ADSI
msExchMailboxGuid
\C2\A4\11\F9\DE\42\C1\42\8D\97\AB\EF\77\66\06\3C
Whereas using the WMI Exchange provider, MailboxGUID is in the following format:
WMI
MailboxGUID
{F911A4C2-42DE-42C1-8D97-ABEF7766063C}
This module provides two functions that will convert between these two formats, making the life of the Win32 Perl scripting system administrator slightly less painful.
The functions listed may be imported into your namespace on demand.
use Win32::MailboxGUID qw[ad_to_exch exch_to_ad];
Or called as class methods.
use Win32::MailBoxGUID; my $guid = Win32::MailboxGUID->ad_to_exch( $adexchguid );
ad_to_exch
Takes a byte array such as the msExchMailboxGuid attribute from an Active Directory user object. Returns the GUID as a MailboxGUID formatted string as per the Exchange_Mailbox WMI class.
Exchange_Mailbox
exch_to_ad
Takes a MailboxGUID formatted string as per the Exchange_Mailbox WMI class. Returns a hex string of the msExchMailboxGuid suitable for searching/updating Active Directory.
http://msdn.microsoft.com/en-us/library/aa143732%28v=EXCHG.65%29.aspx
Chris Williams <chris@bingosnet.co.uk>
This software is copyright (c) 2011 by Chris Williams.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
To install Win32::MailboxGUID, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Win32::MailboxGUID
CPAN shell
perl -MCPAN -e shell install Win32::MailboxGUID
For more information on module installation, please visit the detailed CPAN module installation guide.