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.



georgedschneiderAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

imkotteesSenior Messaging EngineerCommented:
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.
0
georgedschneiderAuthor Commented:
What do you mean by do a match against displayname?
0
Md. MojahidCommented:
Get-MailboxDatabase -Status | Select-Object Name,@{N="DatabaseSize GB";E={"$([math]::round($_.DatabaseSize.Tobytes() /1Gb, 2)) GB"}},AvailableNewMailboxSpace | Sort-Object Name | fl
0
Making Bulk Changes to Active Directory

Watch this video to see how easy it is to make mass changes to Active Directory from an external text file without using complicated scripts.

imkotteesSenior Messaging EngineerCommented:
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.
0
Md. MojahidCommented:
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
0
georgedschneiderAuthor Commented:
Is it not possible to get the primary smtp address as well in one report?
0
SubsunCommented:
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

0
georgedschneiderAuthor Commented:
The Total Item size is blank
0
SubsunCommented:
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

0
SubsunCommented:
If above command works then try..
$(Foreach ($Mailbox in (Get-Mailbox -ResultSize Unlimited)){
$Size = Get-MailboxStatistics $Mailbox.Alias | Select @{N="totalitemsizeGB";E={'{0:f2}' -f ($_.TotalItemSize.Value.ToBytes()/1GB)}}
	New-Object PSObject -Property @{
		Displayname = $Mailbox.Displayname
		Primarysmtpaddress = $Mailbox.Primarysmtpaddress
		totalitemsizeGB = $Size.totalitemsizeGB
	}
})| Export-Csv C:\report.csv -nti

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
georgedschneiderAuthor Commented:
What does the New-Object PSObject do?
0
SubsunCommented:
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
0
georgedschneiderAuthor Commented:
Can you sort by DisplayName or one of the custom objects?
0
georgedschneiderAuthor Commented:
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?
0
SubsunCommented:
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

0
georgedschneiderAuthor Commented:
0
SubsunCommented:
Probably, but I will not be able to test it right now. you can try replacing the code with following line and see if it works for you...
$Size = $Mailbox | Get-MailboxStatistics | Select @{N="totalitemsizeGB";E={[math]::Round( ($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),2)}}

Open in new window

0
georgedschneiderAuthor Commented:
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

0
SubsunCommented:
You can fix it by selecting the object properties in order.. for example..
$(Foreach ($Mailbox in (Get-Mailbox -ResultSize Unlimited)){

#your code here...

}) | Select-Object Name,"Email Address","Mailbox Size",ItemCount

Open in new window

0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Exchange

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.