Link to home
Start Free TrialLog in
Avatar of georgedschneider
georgedschneiderFlag for United States of America

asked on

Get Mailbox Sizes

I'm trying to run a command through EMS to obtain a listing of mailbox sizes for all users in our exchange environment.  Typically I'd use the following command.  What I'd like to include is along with displayname is the Primary SMTP address and to convert the size to a standard unit such as mb or GB.  Any help in this would be greatly appreciated.



Avatar of Kotteeswaran Rajendran
Kotteeswaran Rajendran
Flag of Malaysia image

Hi,

here you go...
Get-MailboxStatistics -Server 'SERVERNAME' | where {$_.ObjectClass -eq “Mailbox”} | Sort-Object TotalItemSize -Descending | ft @{label=”User”;expression={$_.DisplayName}},@{label=”Total Size (MB)”;expression={$_.TotalItemSize.Value.ToMB()}}  -auto >> “c:\Temp\mailbox_size.txt”

you won't get primary smtp address as it is not a parameter of mailbox statistics. You can export it from get-mailbox properties and do a match using display name.
Avatar of georgedschneider

ASKER

What do you mean by do a match against displayname?
Get-MailboxDatabase -Status | Select-Object Name,@{N="DatabaseSize GB";E={"$([math]::round($_.DatabaseSize.Tobytes() /1Gb, 2)) GB"}},AvailableNewMailboxSpace | Sort-Object Name | fl
I meant, export users primary smtp address and displayname from Get-Mailbox and displayname, size from Get-MailboxStatistics. Then using excel macth the displayname to combine both.
Actually by: marahman3001 you got me really close. I figured it out. You dont need the loop in your script. It works great just breaking the command into two parts.

Part One:
assign a variable the entire report that is sorted by mailbox size

$mailboxreport = Get-MailboxDatabase | get-mailboxstatistics | sort-object -property totalitemsize -descending

Part Two:
export the data that that variable holds into a CSV file.

$mailboxreport | select-object displayname, itemcount, @{ expression={$_.TotalItemSize.Value.ToKB()} } , lastloggedonuser, lastlogontime, lastlogofftime, servername, databasename | export-csv c:\userstats.csv

For more
http://exchangeserverpro.com/powershell-tip-get-list-top-exchange-server-mailboxes-size/

http://smtp25.blogspot.in/2009/01/how-to-export-user-mailboxes-and-its_12.html
Is it not possible to get the primary smtp address as well in one report?
Try this..
Get-Mailbox -ResultSize Unlimited | Select Displayname,Primarysmtpaddress,@{N="totalitemsizeGB";E={'{0:f2}' -f (($_ | Get-MailboxStatistics).TotalItemSize.Value.ToBytes()/1GB)}}

Open in new window

To export the result to csv file..
Get-Mailbox -ResultSize Unlimited | Select Displayname,Primarysmtpaddress,@{N="totalitemsizeGB";E={'{0:f2}' -f (($_ | Get-MailboxStatistics).TotalItemSize.Value.ToBytes()/1GB)}} | Export-Csv C:\report.csv -nti

Open in new window

The Total Item size is blank
Does it work when you run against a single user?
Get-Mailbox UserA | Select Displayname,Primarysmtpaddress,@{N="totalitemsizeGB";E={'{0:f2}' -f (($_ | Get-MailboxStatistics).TotalItemSize.Value.ToBytes()/1GB)}}

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of SubSun
SubSun
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
What does the New-Object PSObject do?
It is used to create a custom object..

There are many ways to create a custom object in PowerShell, you can refer following article for details..
http://technet.microsoft.com/en-us/magazine/hh750381.aspx
Can you sort by DisplayName or one of the custom objects?
One question.  This works great in our on premise exchange 2010 SP3 environment.  The problem I run into is when I run it against an Office 365 hosted Exchange environment the mailbox size shows blank.  Any thought why this would occurr in Office 365?
It should work for office 365 also.. Try changing line 2 to following and see if it makes any difference..
$Size = $Mailbox | Get-MailboxStatistics | Select @{N="totalitemsizeGB";E={'{0:f2}' -f ($_.TotalItemSize.Value.ToBytes()/1GB)}}

Open in new window

SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
This code worked with one weird issue.  The item count field is being displayed after Name even though its coded after mailbox size.




$(Foreach ($Mailbox in (Get-Mailbox -ResultSize Unlimited)){
$size = Get-MailboxStatistics $Mailbox.Alias | Select DisplayName,@{name="TotalI<wbr ></wbr>temSizeMB"<wbr ></wbr>;expressio<wbr ></wbr>n={[math]:<wbr ></wbr>:Round(($_<wbr ></wbr>.TotalItem<wbr ></wbr>Size.ToStr<wbr ></wbr>ing().Spli<wbr ></wbr>t("(")[1].<wbr ></wbr>Split(" ")[0].Replace(",","")/1MB)<wbr ></wbr>,0)}},Item<wbr ></wbr>Count 
New-Object PSObject -Property @{
        Name = $Mailbox.Displayname
        "Email Address" = $Mailbox.Primarysmtpaddres<wbr ></wbr>s
        "Mailbox Size" = $Size.totalitemsizeMB
        ItemCount = $Size.itemcount
          }
})

Open in new window

SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial