Exchange 2003 NDR’s are sent a long time after email was sent.

The past two reboots (where the server has been offline for a while) has resulted in non delivery reports being sent back to some of the mailboxes for mail that was sent several weeks ago and that had not been reported as failed when the mail was initially sent.
The first time this happened I thought it was just one of those things, especially as I had not seen mail in the queue before rebooting the server. After the second occurrence I knew it was time to investigate.
SBSisyphus has a great posting including a link to the exchange2003 (sp2) patch that should fix the “kb950757 Email senders do not receive an indication that some messages have been held by Exchange Server 2003 until the SMTP service, The Microsoft Exchange Information Store service, or the Exchange server is restarted”. I applied it to my machine and I’ll have to see what happens.
For what it’s worth you do not need to reboot the server (unless wmiprvse.exe is running – but you get an option to kill this process if it is running before proceeding) but it will stop and start your mail and web services so don’t apply it during the day and it goes without saying that you should have a backup first.

Columbus Meetup on Vmware

I don’t know that much about vmware apart from loading up some virtual images in the vmware player some time ago. I’m more of a hyper-v fan currently, but thats mainly because it fits nicely onto my lab machine.
Anyway, tonight I’m off to the Techlife Columbus Meetup at the Buckeye hall of fame cafe to hear about VMWare courtesy of work. I’m looking forward to it as I should come away with some good tidbits of information and also get to go around the cafe as I’ve never been there before.
The Techlife Columbus group seems to be pretty active and has groups on LinkedIn and also allegedly on Facebook although the link to Facebook doesn’t work (there’s a surprise). Worth checking out to see if there are any social, training or networking events that would be of interest to you, your job or your career. Obviously if you don’t live in Columbus this particular group is unlikely to be of interest, but it would be worth looking to see if there are other groups in your area.

Incidentally my profile pages are here on linkedin and Facebook or you can check out my other networks from my retaggr page.

Unable to sync while offline.

Had a weird issue with a Palm device using Activesync. The device would not synchronise when the laptop pc was working offline. This functionality was fixed/improved in Activesync 4.5 but unfortunately the device was already at this version.
Eventually we found that going to the device and selecting Start > Settings > Connections > USB to PC and remove “Enable advanced network functionality” and then doing a sync worked fine.

Google Love followup.

Ok, so creating my google sitemap didn’t help due to a setting I had already setup in WordPress. When I was testing the migration I had set the privacy options under Settings/ Privacy to block search engines but allow other visitors. This had the unfortunate result of adding the disallow * in the robots.txt file – thus blocking google. Setting it back to make my blog visible has (hopefully) done the trick. Note that the robots.txt is automatically generated by wordpress so you not find one if you go looking with shell access – just access the file through a browser.
Hopefully this setting has not harmed by Google Page rank too much.
Update – just checked and my posts are now appearing in Google again – phew!

Performance monitor showing numbers instead of counters.

Had a weird error today with a machine only showing numbers instead of descriptions in the performance counters. Thanks to maximum asp this is solved by exporting the registry entries from hklm\ Software\ Microsoft\ WindowsNT\ CurrentVersion\ Perflib\ 009 from another machine and importing back into the affected machine. This kind of solution is great if you have another machine that you can export from – not too great if this is the only machine you have access too. If you don’t have access then “You could check the strings in the 009 key under the key described below and look for any garbled entries, entries that have two numbers, or entries that have two strings in succession (you should see ### string ### string, and so on in the multi-sz editor). This may not explain the different behavior between the local and remote cases because they both access the same registry values. (KB152153). Good luck with that!

Argh – I disappeared from Google.

I went to check something on Google that I know I had blogged about and was not happy when I discovered that I wasn’t appearing in Google results anymore. The annoying thing was that my posts were coming in as Technorati results or on a scummy searchengine spammer that had grabbed my content into their system.
I checked Google’s Webmaster tools and found out that my sitemap was woefully out of date so I downloaded the Google XML sitemap plugin by Arne Brachhold and also added the All in one SEO pack plugin for WordPress too.
After installing these two plugins, creating the new sitemap I then told Google where to go find my sitemap. Hopefully this should start getting my results back into Google again.

Powershell script to retrieve email from archived mailbox in Exchange2007

The other powershell script I worked on was to retrieve a detached mailbox that was still retained in exchange, archive the mail to a pst file, move the pst file to the managers home directory and then delete the mailbox again.
The following script does this – note some paths are hardcoded and I already have a temporary account in AD called tempuser that does not have a mailbox. This is the account that the deleted mailbox is attached to.
The main disadvantage to this method is that at the end of the script all of the detached mailboxes will appear as tempuser in the exchange console. In this particular script I also do very little error checking as this was designed for my use but hopefully helps others too.


$user=$args[0] #user is the first parameter passed
$fname=$args[1] #first name
$lname=$args[2] #last name
$fullname=$fname + " " + $lname
$manager=$args[3] #manager windows accountname is the last parameter passed
if ($manager -eq $null) {exit} # if not enough parameters are provided then quit the script

write-host $user
write-host $manager
$Host.UI.RawUI.WindowTitle = "attaching mailbox to tempuser account"

$result=Connect-Mailbox -Identity $fullname -Database 'servername\First Storage Group\Standard User Mailbox' -User 'domain\tempuser' -Alias 'tempuser'

$Host.UI.RawUI.WindowTitle = "Sleeping 60 until moving mailbox"
start-sleep -s 60 # sleep 60 seconds after moving mailbox to tempuser account before doing the export

$Host.UI.RawUI.WindowTitle = "exmerging mailbox"
export-mailbox tempuser -pstfolderpath d:\mailboxes -confirm:$false

$Host.UI.RawUI.WindowTitle ="sleep 20 seconds"
start-sleep -s 20 # sleep 20 seconds after exporting mailbox to tempuser account before doing the mailbox move

$Host.UI.RawUI.WindowTitle = "Moving pst file to managers mailbox"
$newdir="\\archiveserver\c$\users\" + $manager + "\" + $user
$result=mkdir $newdir
$newpst=$newdir + "\" + $user + ".pst"
$newpst
Move tempuser.pst $newpst

$Host.UI.RawUI.WindowTitle = "disabling tempuser mailbox for reuse"
disable-mailbox tempuser -confirm:$false

Note that I use the $Host.UI.RawUI.WindowTitle statement a lot – this enables me to easily see whereabouts in the script I have got to. I much preferred to use the command title in my batch files to do the same thing. Likewise the $null = $host.UI.RawUI.ReadKey(“NoEcho,IncludeKeyDown”) is the equivalent of the batch command pause

Powershell script to retrieve list of emails from Exchange2007 in the past 24 hours.

As in my previous post I needed to obtain a list of emails that have gone through a mail server within the past 24 hours (so it can be run on a daily basis). I struggled with the code initially but ended up with the following.

$yesterday = (get-date).adddays(-1).tostring(“g”)
$rightnow = (Get-Date).ToString(“g”)
get-messagetrackinglog -Start $Yesterday -End $rightnow -EventID RECEIVE -Result size 5000| select-object EventID,Sender,@{name=’Recipients’;expression={[string]::join(“;”,($_.Recipients))}},MessageSubject,TimeStamp | export-csv receive.csv
get-messagetrackinglog -Start $Yesterday -End $rightnow -EventID SEND -Resultsize 5000| select-object EventID,Sender,@{name=’Recipients’;expression={[string]::join(“;”,($_.Recipients))}},MessageSubject,TimeStamp | export-csv send.csv

My next step is to automate this and send it via email

Twitter helped me with powershell this week.

This week at work I’ve been doing a fair amount of work with powershell. It has been a slow process as I’ve had no training in powershell and was basically teaching myself as I went along. I had two goals in mind.

The first was to automatically attach a mailbox to a temporary account, export the mail within this mailbox to a pst file, move the pst file to a folder and then delete the account again.  As Exchange2007 needs to use powershell to export the data I had to change my user deletion script to run within powershell.

My other goal was to write a report for all mail sent or received through the exchange server in the past 24 hours. Using the exchange tracking logs I was able to pull the information required to do this.

The second problem was causing me more hassles  as I could not work out how to retrieve the time from 1 day ago AND have the result in the format needed for the next part of the script. I could get the current time in the correct format OR I could get the time from 1 day ago but not in the current format. I went onto the #powershell room on irc.freenode.net but it looked like everyone was asleep as I didn’t get any response to my query.  I decided to post a tweet on twitter about the problem and within 5 minutes I had about 3 or 4 responses which was great. At the same time I also got a response in the chatroom. As usual with coding, there are several ways to get an answer.  However Jaykul was very helpful in telling me that “get-date (get-date).addays(-1) -f g”  is 2 ten thousandths of a second quicker than “[datetime]::now.adddays(-1).tostring(“g”)”
Best way to get the Time from 24 hours ago.
Now you can probably see why I was confused and struggling to get the code working!

I’m going to post the resulting code in the next posts to make it easier to search on.