PoshCode Logo PowerShell Code Repository

Get-ExchangeDBSizes (modification of post by Karl Mitschke view diff)
View followups from Sean Yu | diff | embed code: <script type="text/javascript" src="http://PoshCode.org/embed/2026"></script>download | new post

Gathers data from Exchange mailbox servers.
These data include:
Server\StorageGroup\Database (2007) or Database (2010),
Total Size (in GB) of the disk,
Size of the .edb file (in GB),
Free disk space,
Percent Disk Free,
Total Mailboxes on the database,
White Space,
Total Free disk space,
Total Percent Free disk space

  1. <#
  2. .SYNOPSIS
  3.         Get-ExchangeDBSizes - Gather data on Exchange 2007 / 2010 Mailbox Databases.
  4. .DESCRIPTION
  5.        Gathers data from Exchange mailbox servers.
  6.                 These data include:
  7.                 Server\StorageGroup\Database (2007) or Database (2010),
  8.                 Total Size (in GB) of the disk,
  9.                 Size of the .edb file (in GB),
  10.                 Free disk space,
  11.                 Percent Disk Free,
  12.                 Total Mailboxes on the database,
  13.                 White Space,
  14.                 Total Free disk space,
  15.                 Total Percent Free disk space
  16. .EXAMPLE
  17.         Get-ExchangeDBSizes
  18. .LINK
  19.                 http://unlockpowershell.wordpress.com/
  20.                 http://poshcode.org/2025
  21. .NOTES
  22.                 File Name: Get-ExchangeDBSizes.ps1
  23.                 Author: Karl Mitschke
  24.                 Requires: Exchange Managemnent Shell
  25.                 Requires: Powershell V2
  26.                 Created: 6/14/2010
  27.                 Modified: 7/28/2010 to convert .EdbFilePath to String
  28.                 Modified: 7/28/2010 - Changed whitespace to a [double]
  29. #>
  30.  
  31.  
  32. Function Get-MountPointInfo($ServerName) {
  33. $Summary = @()
  34. $VolumeHash = @{}
  35. $VolumeCapacityHash = @{}
  36. $DatabaseSizeHash = @{}
  37. $DatabaseFreeHash = @{}
  38. $MountPoints = Get-WmiObject -Class Win32_Mountpoint -ComputerName $ServerName
  39. $MailboxDatabases = Get-MailboxDatabase -Server $ServerName
  40. $Volumes = Get-WmiObject -Class Win32_Volume -ComputerName $ServerName | Where-Object {$_.DriveType -eq 3}| Select-Object Name,FreeSpace,Capacity
  41. $DatabaseLetters = $MailboxDatabases | Select-Object edbfilepath
  42. foreach ($Volume in $Volumes) {
  43. $VolumeHash.Add($Volume.name.TrimEnd("\"),$Volume.FreeSpace)
  44. $VolumeCapacityHash.Add($Volume.name.TrimEnd("\"),$Volume.Capacity)
  45. }
  46. foreach ($drive in $DatabaseLetters)
  47. {
  48.         $letter = $drive.EdbFilePath.ToString().Substring(0,$drive.EdbFilePath.ToString().LastIndexOf("\"))
  49.         $DatabaseSizeHash.Add($letter.TrimEnd("\"),$VolumeCapacityHash[$letter])
  50.         $DatabaseFreeHash.Add($letter.TrimEnd("\"),$VolumeHash[$letter])
  51. }
  52. $VolumeHash.Clear()
  53. $VolumeCapacityHash.Clear()
  54. #Now I have all mailbox databases, along with the OS reported free space and capacity
  55. foreach ($MP in $Mountpoints) {
  56. $MP.directory = $MP.directory.replace("\\","\").Split("=")[1].Replace("`"","")
  57. if($DatabaseSizeHash[$MP.directory])
  58. {
  59. #This mountpoint is a database
  60. $Record = new-Object PSObject
  61. $OSfree = $DatabaseFreeHash[$MP.directory]
  62. $OSCapacity = $DatabaseSizeHash[$MP.directory]
  63. $DestFolder = "\\"+$ServerName + "\" + $MP.directory
  64. $colItems = (Get-ChildItem $destfolder.Replace(":","$") -Recurse| where{$_.length -ne $null} |Measure-Object -property length -sum)
  65. if($colItems.sum -eq $null) {
  66. $fsize = 0
  67. } else {
  68. $fsize = $colItems.sum
  69. }
  70. $TotFolderSize = $fsize + $OSfree
  71. $percFree = "{0:P0}" -f ( $OSfree/$TotFolderSize)
  72. $Record | add-Member -memberType noteProperty -name Server -Value $ServerName
  73. $Record | add-Member -memberType noteProperty -name "Mount Point" -Value $MP.directory
  74. $Record | add-Member -memberType noteProperty -name "Capacity" -Value ("{0:N2}" -f ($OSCapacity /1gb))
  75. $Record | add-Member -memberType noteProperty -name "Used" -Value ("{0:N2}" -f ($fsize / 1gb))
  76. $Record | add-Member -memberType noteProperty -name "Free" -Value ("{0:N2}" -f ($OSfree / 1gb))
  77. $Record | add-Member -memberType noteProperty -name "Percent Free" -Value $percFree
  78. $Summary += $Record
  79. }
  80. }
  81. return $Summary
  82. }
  83. function Get-ExchangeWhiteSpace {
  84. param(
  85.    $ComputerName = $(throw "ComputerName cannot be empty.")
  86. )
  87.  
  88. # Convert Dates to WMI CIM dates
  89. $tc = [System.Management.ManagementDateTimeconverter]
  90. $Start =$tc::ToDmtfDateTime( (Get-Date).AddDays(-1).Date )
  91. $End =$tc::ToDmtfDateTime( (Get-Date).Date)
  92.  
  93. $whiteSpace = @{}
  94.  
  95. # Create two claculated properties for InsertionStrings values
  96. $DB = @{Name="DB";Expression={$_.InsertionStrings[1]}}
  97. $FreeMB = @{Name="FreeMB";Expression={[int]$_.InsertionStrings[0]}}
  98.  
  99. $freespace = Get-WMIObject Win32_NTLogEvent -ComputerName $ComputerName -Filter "LogFile='Application' AND EventCode=1221 AND TimeWritten>='$Start' AND TimeWritten<='$End'" | Select-Object $DB,$FreeMB | Sort-Object DB –Unique –Descending
  100. $freespace | ForEach-Object {$whiteSpace.Add($_.DB,$_.FreeMB)}
  101. #Preceding function from Shay Levy http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2009/08/13/exchange-white-space.aspx
  102. }
  103.  
  104. $AllServers = @()
  105. $ServerVersion = @{}
  106. foreach ($server in Get-MailboxServer)
  107. {
  108.         $ServerName = $server.name
  109.         $version = Get-ExchangeServer -Identity $ServerName | Select-Object AdminDisplayVersion
  110.         if($version.admindisplayversion.major)
  111.         {
  112.                 $ServerVersion.Add($ServerName,$version.admindisplayversion.major)
  113.         }
  114.         else
  115.         {
  116.                 $ServerVersion.Add($ServerName,$version.admindisplayversion.Split()[1].split(".")[0])
  117.         }      
  118. }
  119. foreach ($server in Get-MailboxServer)
  120. {
  121.         $ServerName = $server.Name
  122.         if ([int]$ServerVersion[$ServerName] -gt 8)
  123.         { #An Exchange 2010 server, so use Get-MailboxDatabase <database> -Status | Select-Object AvailableNewMailboxSpace
  124.                 $whiteSpace = @{}
  125.                 $Free = Get-MailboxDatabase -Server $ServerName -Status | Select-Object Server,Name,AvailableNewMailboxSpace
  126.                 foreach ($item in $free)
  127.                 {
  128.                         $db = $ServerName+"\"+$item.Name
  129.                         $whiteSpace.Add($item.Name,[double]$item.AvailableNewMailboxSpace.split("(")[1].Split()[0]/1mb)
  130.                 }
  131.         }
  132.         Else
  133.         {#not an Exchange 2010 server
  134.                 . Get-ExchangeWhiteSpace $ServerName
  135.         }
  136.         $MountPoint = . Get-MountPointInfo $ServerName
  137.         foreach ($objItem in Get-MailboxDatabase -Server $ServerName)
  138.     {
  139.     $edbfilepath = $objItem.edbfilepath
  140.     $path = "`\`\" + $ServerName + "`\" + $objItem.EdbFilePath.ToString().Split(":")[0] + "$"+ $objItem.EdbFilePath.ToString().Split(":")[1]
  141.     $dbsize = Get-ChildItem $path
  142.         $dbpath=(Split-Path $EdbFilePath.ToString().Split(":")[1] -Leaf).trimend(".edb")
  143.         if (!$MountPoint)
  144.         {
  145.                 $mailboxpath = $ServerName + $EdbFilePath.ToString().Split(":")[1].trimend(".edb")
  146.                 $size = get-wmiobject -computername $ServerName win32_logicaldisk |where-object {$_.deviceid -eq $objItem.EdbFilePath.ToString().Split("\")[0]} |select-object deviceID, Freespace, Size
  147.                 $freespace = ($size.freespace / 1GB)
  148.                 $total = ($size.size / 1GB)
  149.         }
  150.         if ($MountPoint)
  151.         {
  152.                 $mailboxpath = "$ServerName\$dbpath"
  153.                 $MPPath = $EdbFilePath.ToString().Substring(0,$EdbFilePath.ToString().LastIndexOf("\"))
  154.                 $freespace = $DatabaseFreeHash[$MPPath ] /1GB
  155.                 $total = $DatabaseSizeHash[$MPPath] /1GB
  156.         }
  157.         $PercentFree = "{0:n2}" -f ($freespace / $total *100)
  158.         if (!$MountPoint)
  159.         {
  160.                 $mailboxcount = Get-MailboxStatistics -database "$mailboxpath"  |Where {$_.DisconnectDate -eq $null -and $_.ObjectClass -eq 'Mailbox'} |measure-object
  161.         }
  162.         if($MountPoint)
  163.         {
  164.                 $mailboxcount = Get-MailboxStatistics -database $mailboxpath.Split("\")[1]  |Where {$_.DisconnectDate -eq $null -and $_.ObjectClass -eq 'Mailbox'} |measure-object
  165.         }
  166.        
  167.         $ReturnedObj = New-Object PSObject
  168.         $ReturnedObj | Add-Member -MemberType NoteProperty -Name "Server\StorageGroup\Database" -Value $objItem.Identity
  169.         $ReturnedObj | Add-Member -MemberType NoteProperty -Name "Total Size (GB)" -Value ("{0:n2}" -f ($total))
  170.         $ReturnedObj | Add-Member -MemberType NoteProperty -Name "Used Space (GB)" -Value ("{0:n2}" -f ($dbsize.Length/1024MB))
  171.         $ReturnedObj | Add-Member -MemberType NoteProperty -Name "Free Space (GB)" -Value ("{0:n2}" -f ($freespace))
  172.         $ReturnedObj | Add-Member -MemberType NoteProperty -Name "Percent Disk Free" -Value $percentfree
  173.         $ReturnedObj | Add-Member -MemberType NoteProperty -Name "User Mailbox Count" -Value $mailboxcount.count
  174.         if ($objitem.Identity.Split("\").Count -eq 3){$dbasename = $objitem.Identity.Substring($objitem.Identity.IndexOf("\")+1)}
  175.         else{$dbasename = $objitem.Identity}
  176.         $ReturnedObj | Add-Member -MemberType NoteProperty -Name "White Space (GB)" -Value ("{0:n2}" -f ($whiteSpace[$dbasename]/1024))
  177.         $ReturnedObj | Add-Member -MemberType NoteProperty -Name "Total Free (GB)" -Value ("{0:n2}" -f ($freespace + $whiteSpace[$dbasename]/1024))
  178.         $TotalPercent = ($freespace + $whiteSpace[$dbasename]/1024) / $total *100
  179.         $ReturnedObj | Add-Member -MemberType NoteProperty -Name "Total Percent Free" -Value ("{0:n2}" -f ($TotalPercent))
  180.     $AllServers += $ReturnedObj
  181.         }
  182. }
  183. $AllServers |Export-Csv C:\scripts\MailboxDatabaseSizeReport.csv -NoTypeInformation

Submit a correction or amendment below (
click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:


Remember me