NAME
Win32::MailboxGUID - functions to convert Exchange mailbox GUIDs
VERSION
version 0.02
SYNOPSIS
# 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
DBI;
$|=1;
my
%limitinfo
= (
'1'
,
'Below Limit'
,
'2'
,
'Issue Warning'
,
'4'
,
'Prohibit Send'
,
'8'
,
'No Checking'
,
'16'
,
'Mailbox Disabled'
,
);
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} } :
''
;
join
','
,
$mailbox
->{MailboxDisplayName},
$mailbox
->{Size},
@quotas
,
$limit
,
$mailbox
->{ServerName},
$mailbox
->{TotalItems} || 0;
"\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'
);
}
DESCRIPTION
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:
\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:
{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.
FUNCTIONS
The functions listed may be imported into your namespace on demand.
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 aMailboxGUID
formatted string as per theExchange_Mailbox
WMI class. exch_to_ad
-
Takes a
MailboxGUID
formatted string as per theExchange_Mailbox
WMI class. Returns a hex string of themsExchMailboxGuid
suitable for searching/updating Active Directory.
SEE ALSO
http://msdn.microsoft.com/en-us/library/aa143732%28v=EXCHG.65%29.aspx
AUTHOR
Chris Williams <chris@bingosnet.co.uk>
COPYRIGHT AND LICENSE
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.