Chris Williams > Win32-MailboxGUID-0.02 > Win32::MailboxGUID

Download:
Win32-MailboxGUID-0.02.tar.gz

Dependencies

Annotate this POD

Website

View/Report Bugs
Module Version: 0.02   Source  

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 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');
  }

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.

  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.

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.

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.

syntax highlighting: