Monday, December 22, 2008

Viewing the downloaded Address Book file in readable format

For troubleshooting reasons I have often looked in the garbled ABS file (GalContacts.db) that is downloaded to the Office Communicator client in the %userprofile%\appdata\Local\Microsoft\Communicator\ folder. I just stumbled over this tip for creating a version of the ABS file in CSV format that is saved in "My Received Files".

Set the following registry key to enable the CSV file creation and then restart Office Communicator.


View Jeff Schertz full tip (with screenshots) in his post Viewing the OCS Address Book (for Humans).

Sunday, December 21, 2008

Office Communications Server 2007 R2 is RTM'ed

On the 19th of December Office Communications Server 2007 R2 was Released To Manufacturing (Build 6907), so it is in good time for the official launch on February 3rd.

We have been working with R2 since the Beta and are currently working hard to develop our material for our 4 days on-site Voice training delivered on R2 (Now based on RC, but will be updated to RTM before the first trainings start in January). Our new training will include training on all aspects of R2, but as usual with a special focus on Voice integration.


New in this version are a lot of things like telephony enhancements and new clients including the Attendant Console (A group based switchboard solution) an updated "Office Communicator for Windows Mobility R2" (Nicknamed CoMo) that includes phone state on mobile phone calls and One Number features (I will do a review of this client later), Dial-in conferencing support (Including CWA support for external clients) and of course enhancements to the overall architecture (Including a move to a 64 bit Server platform) and not least an updated CWA that now supports Desktop Sharing also for external users and non-Microsoft browsers ... and much, much more that I will talk about later (Or that you can find at other blogs).

The official launch of Office Communications Server 2007 R2 will be a soft launch and Inceptio (the company I work for) is participating as a sponsor for this event, that you can sign up for here.

What will we do in terms of spreading the word on R2?

I have had plans to publish information on R2 earlier, but I didn't since it was hard to determine what information was OK to publish and what was not (And I like my MVP benefits to much too risk it). I will now start posting information on R2 starting with the new Windows Mobility client.

Furthermore I will be speaking at Exchange Connections (March 15-18 2009) and I currently have three sessions (Subject to change).

OCS 2007 R2 from PowerPoint to Reality

So you have seen all the nice presentations and demos from Microsoft on Unified Communications and bought the idea!? As you probably guessed, it usually is a tad more complex than the marketing slides tries to convince you, so in this session I will give you the tricks for implementing OCS 2007 R2 in your organization successfully. After this session you will know where to focus your attention before, during, and after your deployment project, including advice on where to focus your attention in terms of the organizational implementation.

Tips and Tricks for Maximizing Your Investment in Unified Communications
So you have OCS 2007 R2 and/or Exchange 2007 implemented in your organization and you are starting to realize your investment by using presence, click-to-dial, one Unified Messaging inbox etc., but maybe you want even more ROI on your investment? In this session we will do a lap around the platform and look under the hood for developers. We will look at and demonstrate how to integrate business processes with Exchange 2007 SP1 Web services, how to build services that manage communications, and also take a look at Windows Workflows that talk and IM.

What Does it Take to Voice-Enable Your OCS 2007 R2 Deployment?

How do you provide OCS 2007 R2 and Exchange with its own voice? This session will focus on all the voice capabilities of OCS and Exchange. We’ll discuss the possible scenarios and how to enable them in your environment. This will include detailed discussions on the actual capabilities of the different solutions and based on experience from real-life deployment the efforts required to implement and maintain the different voice scenarios ranging from a pure standalone Enterprise Voice scenario to a full PBX and UM integrated dual forking scenario.

See all of the sessions here.

Lastly we have our training sessions including 2-4 day (based on previous experience) OCS 2007 R2 Voice Boot Camps that we deliver on-site in Europe, both as open and closed training sessions. They Include level 3-500 training on OCS 2007 R2 infrastrucutre and Voice related subjects and we bring a full lab environment including powerful portables, network, telephony equipment (E.g. Nortel CS1000, Gatewasy and/or soft PBX) wideband GN2000 headsets, and much more. The newest addition to this is our 2-day developer training on R2/Exchange 2007 SP1 (Get more info in this by contacting me at

So I guess 2009 will be yet another busy year ;-)

CU out there !

Tuesday, December 16, 2008

WM 6.1, AccuWeather and Schap's Advanced Config

Just upgraded my HTC Touch Dual to Windows Mobile 6.1 and were doing all my settings again. One program I used to have was Schap's Advanced Config (SAC) but in v1.1. From the site, I got v2.0 and that had a nice new feature: You can change the location used by the weather forecast application. My problem was that Billund, Denmark could not be chosen from the list, but by finding Billund at, I could get the city code EUR|DK|DA008|BILLUND from the URL and specify that using SAC. Now the weather app shows the correct forecast :)

Friday, December 12, 2008

Matching multi-line text and converting it into objects

Sometimes your input is simply text and you have to work with it. If it is line-based e.g. each object is a separate line, it is not so hard, but what if the output is very dynamic and the information you need to combine spans multiple lines? In this case, you could start making some kind of state machine e.g. when the starting point is reached, set a variable, save data as you go and when the ending point or the next starting point is reached, construct the object and emit it to the pipeline so it can be used.

Well, there are better ways and in this example, I'll combine these things to make is much more straight-forward and generic -

  • Use regular expressions (regex) for matching the information you want
  • Show how to construct a regex in a readable way spanning multiple lines and containing comments
  • Using a dynamic approach, where the named captures in the regex are automatically converted into properties on the output object. This means that you only have to specify the name one, the loop processing the matches is totally generic and can be reused.

The examples uses output from repadmin /showrepl, but this is just an example I picked up more or less randomly. The idea here is to show the use of regex and converting the result to objects, the idea is not to create a bullet-proof parser of the output from repadmin /showrepl.

Here's the example -

# Define some text, in this case the text is stored in $text, but
# is could come from anywhere

DC Options: IS_GC
Site Options: (none)
DC object GUID: aff429b7-5694-4bda-ae4a-daa7d371ce0f
DC invocationID: b578e349-5846-46c5-8e01-b4a81d609e27
==== INBOUND NEIGHBORS ======================================
BLL\045ADDC001 via RPC
DC object GUID: 26446473-3433-4c73-942d-c750f0e476ec
Last attempt @ 2007-08-21 13:38:53 was successful.
BLL\045ADDC001 via RPC
DC object GUID: 26446473-3433-4c73-942d-c750f0e476ec
Last attempt @ 2007-08-21 13:38:53 was successful.
BLL\045ADDC001 via RPC
DC object GUID: 26446473-3433-4c73-942d-c750f0e476ec
Last attempt @ 2007-08-21 13:38:54 was successful.
BLL\045ADDC001 via RPC
DC object GUID: 26446473-3433-4c73-942d-c750f0e476ec
Last attempt @ 2007-08-21 13:38:54 was successful.
BLL\045ADDC001 via RPC
DC object GUID: 26446473-3433-4c73-942d-c750f0e476ec
Last attempt @ 2007-08-21 13:38:54 was successful.

$regex=[regex] "(?msx)
# Option m = multi-line e.g. ^=start of line and $=end of line
# Option s = single-line e.g. . includes end-of-line
# Option x = spaces and comments are allowed in the pattern making this
# line possible

# Start of line (^), match partition, eat until end of line ($)
^ (?<partition> (CN|DC)=[^`$]+? )`$

# any chars - ? means lazy i.e. match as few characters as possible

# match site before \ using a series of wordchar
(?<Site> \w+) \\

# match domain controller afterwards
(?<DC> \w+)

# any chars

# match the date last attempted, note the spaces are escaped as option x is used
Last\ attempt\D+ (?<date> [\d\-]+\ [\d\:\.apm]+ )

# Search for pattern matches in $text
$regex.matches($text) | Foreach-Object {
# Save current pipeline object, so it is available from inside the next foreach-object
# Construct a new, empty object. Always return objects as output whenever possible. It
# makes using the output must easier
$obj=new-object object
# Get all the group names defined in the pattern - ignore the numeric, auto ones
$regex.GetGroupNames() | Where-Object {$_ -notmatch '^\d+$'} | Foreach-Object {
# And add each match as a property. When multiple results are returned, the
# value must be picked up using an index number hence the GroupNumberFromName call
add-member -inputobject $obj NoteProperty $_ $match.groups[$regex.GroupNumberFromName($_)].value
# emit the object to the pipeline


This is the output -

partition                     Site                          DC                            date
--------- ---- -- ----
DC=company,DC=org... BLL 045ADDC001 2007-08-21 13:38:53
CN=Configuration,DC=compan... BLL 045ADDC001 2007-08-21 13:38:53
CN=Schema,CN=Configuration... BLL 045ADDC001 2007-08-21 13:38:54
DC=DomainDnsZones,DC=compa... BLL 045ADDC001 2007-08-21 13:38:54
DC=ForestDnsZones,DC=compa... BLL 045ADDC001 2007-08-21 13:38:54

A final note: If you input is an array of strings, you have to convert it into a single text string before calling $regex.matches. This can easily be done, by joining the elements using newline as a delimiter -