Posts Tagged ‘mailbox’

Hi Folks,

today’s challenge was to bulk set calendar rights in a multilingual environment (with powershell).
On the net you can find some articles that address similar problems, but no real solution.

Download the follwing scripts as txt here.

Here my quick an dirty script:

# Set default as LimitedDetails for all calendars.
# Will get the language forch each users calendar Folder
# foreach($mbx in Get-Mailbox -identity USER | where-object {$_.displayname -like "*test user*"})

foreach($mbx in Get-Mailbox -ResultSize Unlimited | where-object {$_.displayname -notmatch "discovery"})

$Calfolder = $Mbx.Name
$Calfolder += ':\'
$CalFolder += [string](Get-mailboxfolderstatistics $Mbx -folderscope calendar).Name
$mbx = $CalFolder
$test = Get-MailboxFolderPermission -Identity $mbx -erroraction silentlycontinue
if($test -ne $null)
Set-MailboxFolderPermission -Identity $mbx -User Default -AccessRights LimitedDetails | out-null

If you want to create all new mailboxes with special permissions you nee to configure the Cmdlet Extension Agent
To enable the agent this you have to the following steps:

  • Create an XML file named ScriptingAgentConfig.xml  and save it in your Exchange’s Default Directory on EVERY Exchange Server in your organization
    e.g. C:\Program Files\Microsoft\Exchange Server\V15\Bin\CmdletExtensionAgents

    <?xml version=”1.0″ encoding=”utf-8″ ?>
    <Configuration version=”1.0″>

    <Feature Name=”MailboxProvisioning” Cmdlets=”New-Mailbox”>
    <ApiCall Name=”OnComplete”>
    start-sleep -s 10
    $mbx =  (Get-User $provisioningHandler.UserSpecifiedParameters[“Name”]).distinguishedName
    Set-MailboxFolderPermission -Identity $mbx”:\Calendar” -User “Default” -AccessRights LimitedDetails

    <Feature Name=”MailboxProvisioning” Cmdlets=”Enable-Mailbox”>
    <ApiCall Name=”OnComplete”>
    start-sleep -s 5
    $user = Get-User -Identity $provisioningHandler.UserSpecifiedParameters[“Identity”]
    $mbx = Get-Mailbox -Identity $user.DistinguishedName
    Set-MailboxFolderPermission -Identity $mbx”:\Calendar” -User “Default” -AccessRights LimitedDetails



  • Use the Exchange Management Shell and run the following command on EVERY Exchange server in your organization:
    Enable-CmdletExtensionAgent “Scripting Agent”
  • Create new user



If not configured Exchange sets the standard notification schedule to monday, 4 a.m. once a week. To bulk change this, you have to edit all databases properties with the EMC or simply run the following PowerShell command with equals the GUI setting “Daily 2 a.m.” :

Get-MailboxDatabase | Set-MailboxDatabase -QuotaNotificationSchedule ‘So.02:00-So.02:15, Mo.02:00-Mo.02:15, Di.02:00-Di.02:15, Mi.02:00-Mi.02:15, Do.02:00-Do.02:15, Fr.02:00-Fr.02:15, Sa.02:00-Sa.02:15’

To check this settings for all DBs run the following command:

Get-MailboxDatabase | fl Name, QuotaNotificationSchedule



Here’s the PowerShell command to remove the last arbitration mailbox to prepare uninstall of Exchange 2010.

Get-Mailbox -Arbitration | Remove-Mailbox -RemoveLastArbitrationMailboxAllowed



Here comes the command to get an overview over recoverable items in a mailbox:

Get-MailboxFolderStatistics -Identity -FolderScope RecoverableItems | Format-Table Name,FolderPath,ItemsInFolder,FolderAndSubfolderSize




With this command you get an overview over a certain user’s mailbox folders:

Get-MailboxFolderStatistics | ft folderpath, itemsinfolder

You can limit this to special folder, too:

Get-MailboxFolderStatistics -identity -FolderScope ‘DeletedItems’ | Select Identity, FolderPath, ItemsInFolder, FolderSize



Recently it was necessary to change  the “From” display name of the sending notifications. This notifications appear e.g. when your mailbox size hits the quota or you get an internal NDR. It’s not possible to edit the sender email address in EMC or EMS but you can change the Display Name of this notification sender by using ADSIEdit.

  • Open ADSIEDIT – Configuration
  • Open the following path:
    Services -> Microsoft Exchange -> “Your Exchange Organization” -> Transport Settings
  • Right click properties on CN=MicrosoftExchange329e71ec88ae4615bbc36ab6ce41109e

In the properties navigate to “displayName” and edit the default value named “Microsoft Outlook” to the display name you want to have.

Click OK and close ADSI Edit.

That’s it.



With this PowerShell command you get an overview of database sizes, last full backups and active servers.

(get-mailboxdatabase -status) | foreach-object {write-host $_Server $_.Name $_.lastfullbackup $_.databasesize}



A quick powershell command to figure out the number of mailboxes per database:

(get-mailboxdatabase) | foreach-object {write-host $ (get-mailbox -database $}



If you want to discover where a specific user has Full Access you can use this PowerShell command:

Get-Mailbox | Get-MailboxPermission -User | where { ($_.AccessRights -eq “FullAccess”) }



The follwing script generates e-mail statistics of your exchange environment looking like this:
(Download the script HERE!)

Generated on Server: MAILSERVER
Date: 17.01.2012
Sent mails: 532435
Size of sent mails: 4.419,24 MB
Size of biggest mail out: 21,74 MB
Average size out: 217,69 KB
Quantity incoming mails: 66496
Size of received mails : 4.609,09 MB
Size of biggest mail in: 22,52 MB
Average size in : 161,96 KB
Overall quantity : 43172
Overall size : 9.028,33 MB

You have to change the following parameters:

$SmtpClient.Host = “YOUR_HT_SERVER”
$mailmessage.from = “Exchange_2010_NoReply@YOURDOMAIN.COM”
# $mailmessage.CC.add(“CC_RECIPIENT@YOURDOMAIN.COM”)
$mailmessage.Subject = “Exchange daily message Report

$Localhost = $env:COMPUTERNAME
#Load Exchange PS Snapin
If ((Get-PSSnapin | Where-Object {$_.Name -eq “Microsoft.Exchange.Management.PowerShell.E2010”} ).name -eq ‘Microsoft.Exchange.Management.PowerShell.E2010’)
Write-Host “Exchange Snapin is already loaded….”

Write-Host “Loading Exchange Snapin Please Wait….”; Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
Write-Host “running…”

$hubs = Get-TransportServer

# Get the start date for the tracking log search
$Start = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-1)

# Get the end date for the tracking log search
$End = (Get-Date -Hour 23 -Minute 59 -Second 59).AddDays(-1)

$Datum = $Start.ToShortDateString()

$receive = $hubs | get-messagetrackinglog -Start $Start -End $End -EventID “RECEIVE” -ResultSize Unlimited | select Sender,RecipientCount,TotalBytes,Recipients
$send = $hubs | get-messagetrackinglog -Start $Start -End $End -EventID “SEND” -ResultSize Unlimited | select Sender,RecipientCount,TotalBytes
$mreceive = $receive | Measure-Object TotalBytes -maximum -minimum -average -sum
$msend = $send | Measure-Object TotalBytes -maximum -minimum -average -sum

$anzahl = $mreceive.count + $msend.count
$volumen = ($mreceive.sum + $msend.sum) / (1024 * 1024)

$volumen = “{0:N2}” -f $volumen + ” MB”

$msendmb = $msend.sum / (1024 * 1024)
$vsend = “{0:N2}” -f $msendmb + ” MB”
$bigsend = $msend.maximum / (1024 * 1024)
$avsend = $msend.average / 1024

$bigsendmb = “{0:N2}” -f $bigsend + ” MB”
$avsendkb = “{0:N2}” -f $avsend + ” KB”

$mreceivemb = $mreceive.sum / (1024 * 1024)
$vreceive = “{0:N2}” -f $mreceivemb + ” MB”
$bigreceive = $mreceive.maximum / (1024 * 1024)
$avreceive = $mreceive.average / 1024

$bigreceivemb = “{0:N2}” -f $bigreceive + ” MB”
$avreceivekb = “{0:N2}” -f $avreceive + ” KB”

#$senders = $send | Group-Object Sender | Sort-Object Count -Descending
#$topsender = $senders[0].Name
#$topsender += $senders[0].Count

#$receivers = $receive | Group-Object Recipients | Sort-Object Count -Descending
#$topreceiver = $receivers[0]

$computer = gc env:computername
$obj = new-object psObject

$obj |Add-Member -MemberType noteproperty -Name “Generated on server:” -Value $Computer
$obj |Add-Member -MemberType noteproperty -Name “Date :” -Value $Datum
$obj |Add-Member -MemberType noteproperty -Name “Sent mails :” -Value $msend.Count
$obj |Add-Member -MemberType noteproperty -Name “Size of sent mails:” -Value $vsend
$obj |Add-Member -MemberType noteproperty -Name “Size of biggest mail out:” -value $bigsendmb
$obj |Add-Member -MemberType noteproperty -Name “Average size out :” -value $avsendkb
$obj |Add-Member -MemberType noteproperty -Name “Quantity incoming mails :” -Value $mreceive.Count
$obj |Add-Member -MemberType noteproperty -Name “Size of received mails :” -Value $vreceive
$obj |Add-Member -MemberType noteproperty -Name “Size of biggest mail in :” -value $bigreceivemb
$obj |Add-Member -MemberType noteproperty -Name “Average size in :” -value $avreceivekb
$obj |Add-Member -MemberType noteproperty -Name “Overall quantity :” -Value $anzahl
$obj |Add-Member -MemberType noteproperty -Name “Overall size :” -Value $volumen

$out = $Datum + “;” + $msend.count + “;” + $vsend + “;” + $mreceive.count + “;” + $vreceive + “;” + $anzahl + “;” + $volumen
$out | out-file c:\daily.csv -append -encoding default

function sendmail($body)
$SmtpClient = new-object
$MailMessage = New-Object
$SmtpClient.Host = “YOUR_HT_SERVER”
$mailmessage.from = “Exchange_2010_NoReply@YOURDOMAIN.COM”
# $mailmessage.CC.add(“CC_RECIPIENT@YOURDOMAIN.COM”)
$mailmessage.Subject = “Exchange daily message Report $Datum”
$MailMessage.IsBodyHtml = $false
$mailmessage.Body = $body


$obj = $obj -replace(“@{“,””)
$obj = $obj -replace(“=”,”:`t”)
$obj = $obj -replace(“; “,”`n”)
$obj = $obj -replace(“}”,”`n”)

sendmail $obj