Powershell Needful Things put that in your pipeline


Exchange 2010 Cleanup Utility

Posted by Jean Louw

Good news!

I have completed the update of the Exchange mailbox cleanup tool, for use with Exchange 2010.

I don't have access to a 2010 server at the moment to finalise testing.

I should be able to complete testing next week, and post the updated utility to the site.

Filed under: cleanup, exchange 2 Comments

Find SAMAccountName with trailing space

Posted by Jean Louw

The other day, one of the security guys at a customer had a problem with a reporting package which needs to import objects from Active Directory via LDAP.

The process appeared to import a limited amount of user accounts and then stop.

Feedback provided by the vendor, stated that we had duplicate SAMAccountNames in the domain, which as you know is impossible.

I started investigating the issue, and found a number of objects which, at first appeared to have duplicate SAMAccountName properties. On further investigation, I found that some of these duplicates, were indeed similar, but ended in a trailing space.

I tested this, and it seemed that the ADUC does not allow you to create objects with trailing spaces, so these objects may have been imported from other directories, or old NT4 migrations etc.

I needed a way to find all the objects with trailing spaces in the SAMAccountName property to send the list to the administrators to fix, as this involved some human interaction which I am unable to script.

This seemed easy at first, once you realise that not all SAMAccountName properties are the same length!

The following script will use the Exchange Get-User cmdlet to determine the length of the SAMAccontName property, and then inspect the last character in the string to see if it is a space. If it is, it is added to a variable and reported at the end.

Hopefully this script saves you some time.

$broken = @{Name="Broken";expression={foreach-object {($_.SAMAccountName).ToString().SubString((($_.SAMAccountName.ToString().Length)-1),1).Contains(' ')}}}

$users = Get-User -Resultsize Unlimited

Foreach ($user in $users){
If (($user | Select $broken).broken -eq $True){
[array]$brokenAccounts += $user}

$brokenAccounts | Select Name, SAMAccountName, $broken

Updated: Exchange 2010 Audit Script

Posted by Jean Louw

I have made some updates to the script:

  • Fixed the pipeline issue – You can now use commands like Get-ExchangeServer and pipe that to the script to build a server selection.
  • Embedded the header image into the HTML – This now allows you to display the image even if the server is not connected to the Internet.
  • Changed logical disk information to volume information – This will include volume mount points.
  • Database whitespace – the mailbox database report now displays the whitespace for each database.
  • Move Requests – I have added the ability to display uncleared move requests. This however will currently display on the report for any mailbox server.
  • The version number now correctly displays as 1.1 instead of 4.

Some items I still need to fix:

  • HTML / javascript error with single file report.
  • Colour on the move request section.
  • DAG information and mailbox count by server.
  • Display move requests from current server only.

If you have any additional requests for items you would like to see in the script, or even of you feel the colour scheme is horrible, please let me know.

More complete information, and the download link for the script can be found here:


Exchange 2010 Audit Script – Version 1

Posted by Jean Louw

I have had a couple of requests from a few readers for access to test the Exchange 2010 version of the Audit script, and I made a commitment to have this ready in January 2011. Although the script is nowhere near complete, this is a full working version which can be used to collect information from Exchange 2010 servers.

I have been very busy between work and family commitments, so I will continue to add features as and when time permits.

A couple of bugs I am aware of:

  • You cannot pipe server names to the script yet – this worked on the 2007 script so I need to spend time troubleshooting this.
  • You need to create the test mailboxes manually – refer to my post here for more info: http://www.powershellneedfulthings.com/?p=124
  • You can use the "-output s" parameter to force multiple scans onto a single report. There is a bug in the HTML code which causes the expand function on the HTML report to work incorrectly.

A couple of features I still plan to add:

  • Add volume mount points into the disk report.
  • Database Availability Group reports - I plan to add some reports with regards to the DAG if the server is a member of a DAG.
  • If a database is currently active on a server report on the number of mailboxes and total mailbox count for the current server.
  • Report on uncleared move requests and their status.

I know development is a little slow at the moment, but please be patient, when I start Exchange 2010 in a VM on my current laptop its like I have kicked it in the stomach. I will need to upgrade soon, and I am considering creating a donation option on to enable you guys to contribute to the hardware, but at this stage it is still debatable.

Other than that, I hope you can use the script in your environment, and please send me your feedback and enhancement requests so that I can add them to the wish list.

More complete information, and the download link for the script can be found here:


Automatic Custom Mailbox Limits

Posted by Jean Louw

This little script runs through the Exchange mailboxes and reads the current mailbox size, and sets a new warning limit and send limit for each mailbox, based on the current size.

So basically it looks at the current size of the mailbox, and sets a warning, at current size + 250MB and a send limit, at current size + 350MB. This was a quick workaround for us in an unmanaged environment to quickly establish some method of control without granting over sized limits, in order to accommodate large mailboxes.

This scripts should be run from the Exchange Management Shell.

The code can be copied from here:

$boxes = get-mailbox -resultsize unlimited | Get-MailboxStatistics

Foreach ($box in $boxes)
        $name = $box.DisplayName
        $currentSize = $box.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",", "")
        $WarningQuota = ([int]$currentSize + 262144000)
        $SendQuota = ([int]$currentSize + 367001600)

        Set-Mailbox -Identity $name -IssueWarningQuota $WarningQuota -ProhibitSendQuota $SendQuota

Repair Exchange mailbox display name case

Posted by Jean Louw

We had a problem at one of our customers, where the users were created (by someone else :)) in ALL CAPS. This is more of an annoyance that anything else so I wrote a little script to read the names, and set the case from UPPER CASE to Proper Case.

You obviously have to run this from the Exchange Management Shell.

You can copy the code for the script from here:

$mailboxes = Get-Mailbox

foreach ($mbx in $mailboxes)
        write "..currenntly processing:" $mbx.Name
        $oldName = $mbx.Name.ToString().Split(' ')
        $newName = ($oldName | foreach {$_.Substring(0,1) + $_.SubString(1).ToLower()})
        $mbx | set-mailbox -name $newName -displayname $newName

Creating Test Mailboxes for Mailbox Servers

Posted by Jean Louw

After a couple of requests for more information with regards to the CAS monitoring mailbox, and how to create them, I am going to do a quick cut / paste from Technet:

Create Test Mailboxes for OWA, ActiveSync, and Exchange Web Services Connectivity Monitoring.

The Exchange Server 2007 Management Pack uses cmdlets to test Microsoft Office Outlook Web Access (OWA), Microsoft ActiveSync, and Exchange Web Services connectivity from Client Access servers to Mailbox servers.

These cmdlets require that a test mailbox be created on each Exchange Server 2007 Mailbox server that is to be tested. In this procedure you create test mailboxes for OWA, ActiveSync, and Exchange Web Services connectivity monitoring by using PowerShell to run the New-TestCasConnectivityUser.ps1 script. The appropriate mailbox is created on each Mailbox server by piping in the results of get-mailboxServer.

To create a test mailbox for OWA, ActiveSync, and Exchange Web Services connectivity monitoring

1. On a Mailbox Server, open PowerShell and change directory to the C:\ Program Files\Microsoft\Exchange Server\Scripts folder.
2. Execute the following command: get-mailboxServer | .\new-TestCasConnectivityUser.ps1

Follow the on-screen installation instructions to complete the creation of the test mailbox. When requested, provide a temporary password for the test mailbox. The password must conform to your domain password policy.

This will create a new CAS_ user for each mailbox server. The number following the _ is the GUID of the mailbox server which the test user belongs to.
Remember, this user account is used commands like Test-ActiveSyncConnectivity, Test-OWAConnectivity etc. These mailboxes are also required when using the Exchange 2007 Management Pack for MOM.

These accounts are also required when using my Exchange 2007 Audit Script, as it relies on the test-* cmdlets.


Exchange 2010 Audit Script

Posted by Jean Louw

I have started development on the Exchange 2010 version of my Audit script.

If all goes well I intend to add the following features:

1. Location of database in the DAG
2. Mailbox count per database.
3. Current Mailbox count / server
4. Uncleared move requests and their status.
5. Exchange service pack and roll information
6. A new look and feel - more Exchange 2010-ish.

If time permits, I am aiming to have this ready by the 1st of January 2011.

Watch this space for updates, or join the email feed to stay updated.


Site Migration

Posted by Jean Louw

Site Header

Hello devoted readers and newcomers. Welcome to my new blog site.

You have been redirected from the old Blogger page!

I have relocated from Blogger to a hosted solution as this gives me more flexibility and control with plugins and editing, especially with regards to code blocks.

Lately I have found Blogger to become more and more cumbersome to use, and this caused me to blog less and less. Hopefully now with the new site, and new functionality I will be posting scripts on a more regular basis.

If you came here looking for a specific post, please use the search if you are unable to locate the post. The site is still a work in progress, so if something does not work as it should, please pop me a mail, or leave a comment and I will repair the fault as soon as I can.

To all of the mailing list subscribers, I have feedburner installed on the new site, you should be able to use the link on the side to subscribe to the feed again.

Thanks for your support, and enjoy the site and the content provided, if you like what you read, please reweet the post.

As always, your comments and suggestions are always welcome.

PS.: I have added an image which I use as a header for the site. You can download it and use it. It makes a pretty cool desktop background.

Filed under: general, info, site No Comments

Check free space on volume mount points

Posted by Jean Louw

Wow! It’s been a while since I have posted any scripts! This is mainly due to the fact that I am rather busy at work, and also working hard at completing my MCITP.

A while back a client of mine, asked if there was an easy way to use one computer to check the free space of mount points. This was a real problem for them, as the administrators would come in every morning and manually logon to each server, and use disk management to check the free space.

I was certain that there had to be a WMI object for mount points, so after a little digging, I came up with the following script:

$TotalGB = @{Name="Capacity(GB)";expression={[math]::round(($_.Capacity/ 1073741824),2)}}
$FreeGB = @{Name="FreeSpace(GB)";expression={[math]::round(($_.FreeSpace / 1073741824),2)}}
$FreePerc = @{Name="Free(%)";expression={[math]::round(((($_.FreeSpace / 1073741824)/($_.Capacity / 1073741824)) * 100),0)}}

function get-mountpoints {
$volumes = Get-WmiObject -computer $server win32_volume | Where-object {$_.DriveLetter -eq $null}
$volumes | Select SystemName, Label, $TotalGB, $FreeGB, $FreePerc | Format-Table -AutoSize

$servers = (Get-Content .\servers.txt)

foreach ($server in $servers){

The script is written to collect server names from a text file, but you could use any other method to supply you server names.

Hope this helps someone else!