Fun With Custom PSObjects

I was recently asked to generate a report on mailbox usage by a specific subset of AEMS users.  The tricky part is that the various pieces of info that I need are returned by two distinct Exchange Management Shell commands.  In order to merge properties from two different returned objects, I found it expedient to tack the values from those properties into a new PSObject:

#initializing an array to hold the constructed PSObjects
[array]$users = $null          

#  iterate through all members of myGroup
Get-DistributionGroupMember “myGroup” | ForEach-Object {    
# some info needed from Get-Mailbox
$mb=get-mailbox  $_.samaccountname    
# some from Get-MailboxStatistics
$mbstats = get-mailboxstatistics $_.samaccountname   

# create PSObject into which we will merge results
$user = New-Object PSObject   

# Now we add the desired properties into the PSObject
$user | Add-Member NoteProperty Name $mb.DisplayName
$user | Add-Member NoteProperty Usage $mbstats.TotalItemSize.Value.ToMB() 
$user | Add-Member NoteProperty Quota $mb.ProhibitSendQuota
$user | Add-Member NoteProperty Account $mb.SamAccountName 

# skipping users for whom no data is returned because they’ve never logged in
if ($mb.DisplayName -ne $NULL){$users += $user}

}

# Now, export the report as a CSV file:
$users | export-csv -path .\myGroup-Users.csv

PowerShell Training

The folks at Microsoft have made it pretty clear that they regard PowerShell (the scripting language formerly known as “monad”) as the future for managing their server products. Exchange 2007 was just the first wave, with the latest versions of SharePoint and SQL quickly following suite.  When Windows Server 2008 R2 is released, it will be accompanied by PowerShell v2.0, which will include a whole new batch of AD management cmdlets (including one for un-deleting AD objects – yeah!), as well as a PSDrive provider which will allow the Active Directory to be accessed from PowerShell as if it were a filesystem.

Last week, I and several of my collegues had the good fortune to attend a PowerShell training class.  Although I’ve been using PowerShell now for over a year to manage Exchange 2007, the class did provide a good opportunity to bone up on the fundamentals, and even helped me clear up some misconceptions that I had about how certain commands work. (ForEach and ForEach-Object are different commands?  That explains a lot….)

For anyone interested in learning more about PowerShell, here are some good resources: