Today I have mostly been fighting with Microsoft Office Outlook 2007 and our Office 365 setup, as we are still in the early stages of deployment we have not yet implemented our ADFS servers. Which means we have are experiencing some pretty frustrating issues with Office and authentication.
One machine in particular decided to really test my patience and blankly refused to authenticate, presenting the user with a constant reoccurrence of the “Welcome back to Outlook.Office365″ login box.
As it happened the machine had seemed to avoid the installation of several service packs, including Office 2007 Service Pack 3, and also what turned out to be some pretty important KB hot fixes. Leaving me scratching my head for what seemed like a lifetime… That was until today! When I finally managed to find the relevant KB hot fixes and install them manually..
You can find a list of the required KB fixes over here on this Wiki.
The journey to 365 has been a long and winding one… This particular highlights the importance of ensuring all machines connecting to 365 are bang up to date with Windows and Office updates and service packs… Lesson learnt.
Microsoft Lync is Microsoft’s latest offering of a unified communications system. Sporting features you’d expect to find in a SIP/Unified Comms client, Lync is a pretty powerful piece of kit.
What’s more, Microsoft offer an SDK to enable easy development of tools and add-ons using Lync technologies. Most of the tutorials and blog posts seem to focus on either C# or Silverlight, which is fine – however, as I am primarily a VB.Net developer I decided to publish my own guide on how to intercept and respond to received Lync messages.
Firstly, I need to point out that I have only had access to Lync for a couple of months now and only downloaded the SDK earlier this month.. So although the code below is functional, I am constantly learning and may find a better way of doing things as my learning continues. To make things easier, make sure you subscribe to the post and you’ll get an update each time I adjust the code.
You will need to download and install the Microsoft Lync SDK then fire up your copy of Visual Studio, create a new windows form project. Obviously you could use any type of project here, however I have plans for a GUI in the future so I am using a windows form project.
Now, open the code view of your new form and import the following:
Imports Microsoft.Lync.Model Imports Microsoft.Lync.Model.Conversation
Now, under your “Public Class Form1″ but before your “Private Sub Form1_Load()” enter the following lines of code:
Public WithEvents _Client As LyncClient Public WithEvents _ConversationMgr As Microsoft.Lync.Model.Conversation.ConversationManager Private WithEvents _LocalIMModality As InstantMessageModality Public _LycConversation As Microsoft.Lync.Model.Conversation.Conversation
That’s all there is to it for the declarations, as you can see I have used ‘WithEvents’ to expose the ‘methods’ in the GUI and make things a little easier developing with them.
Next in the “Form_Load()” event, paste in the following code:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
_Client = LyncClient.GetClient()
_ConversationMgr = _Client.ConversationManager
Select Case _Client.State
Case ClientState.Uninitialized
_Client.BeginInitialize(AddressOf InitializeCallback, Nothing)
Case ClientState.SignedIn
Case ClientState.SignedOut
_Client.EndSignIn(_Client.BeginSignIn(Nothing, Nothing, Nothing, Nothing, Nothing))
End Select
Catch ex As AlreadyInitializedException
MessageBox.Show("Another process has initialized Lync")
Catch ex As Exception
End Try
End Sub
Private Sub InitializeCallback(ByVal ar As IAsyncResult)
_Client.EndInitialize(ar)
_InitializeFlag = True
_Client.EndSignIn(_Client.BeginSignIn(Nothing, Nothing, Nothing, Nothing, Nothing))
End Sub
This essentially ties your code to the Lync client running on your machine, then using ‘automation’ it confirms the client is signed in, if not it signs in for you.
Now, your app is hooked into the Lync client, you will need to ‘capture’ the message received event and handle it appropriately.
Private Sub _ConversationMgr_ConversationAdded(ByVal sender As Object, ByVal e As Microsoft.Lync.Model.Conversation.ConversationManagerEventArgs) Handles _ConversationMgr.ConversationAdded
_LocalIMModality = TryCast(e.conversation.Participants(1).Modalities(ModalityTypes.InstantMessage), InstantMessageModality)
End Sub
Private Sub _LocalIMModality_InstantMessageReceived(ByVal sender As Object, ByVal e As Microsoft.Lync.Model.Conversation.MessageSentEventArgs) Handles _LocalIMModality.InstantMessageReceived
Dim strRec As String
strRec = e.Text.Replace(vbCr, "").Replace(vbLf, "").Replace("'", "''")
End Sub
As you can see from the post above, I am using the built in replace functionality of the string. This is because the Lync client passes line feeds after its message, which makes handling the received message quite complicated.
So, from the code above – each time an instant message is received by your Lync client the variable strRec will contain the received message.
Now, upon receipt of a message you may want to send a response – which is where my next code snippet comes in. The following Sub send’s an instant message to the participants of the conversation:
Public Sub SendIM(ByVal strMessage As String)
Dim modal = DirectCast(LycConversation.Modalities(Lyc.ModalityTypes.InstantMessage), InstantMessageModality)
modal.BeginSendMessage(strMessage, AddressOf SendMessageCallback, Nothing)
End Sub
Private Sub SendMessageCallback(ByVal r As IAsyncResult)
End Sub
From the code above, you should see the sub requires a string to be passed to it. This is what will be relayed to the client who sent the original message.
So there you have it, a fairly simple way of receiving and sending back a Lync ‘IM’.
Obviously, you may want to improve this slightly by trimming the received message and handling it depending on the users request. So, for example – you may want to ‘serve’ a simple weather forecast based on the users request. To do this all you need to do is enhance the ‘_LocalIMModality_InstantMessageReceived’ sub to include code something like this:
If InStr(strRec.ToUpper, "Weather", CompareMethod.Text) Then
GetWeatherReport(Mid(strRec.ToUpper, 9).ToString)
Exit Sub
End If
Now, create another sub which makes use of Yahoo’s weather forecasting, to reply to the Lync user with details of the local forecast:
Sub GetWeatherReport(ByVal locationId As String)
On Error GoTo ErrHand
1: Dim YahooCode As Integer
2: Select Case locationId
Case "ABERDEEN"
3: YahooCode = 10243
4: Case "LINLITHGOW"
5: YahooCode = 26318
6: Case "GLASGOW"
7: YahooCode = 21125
8: Case "IRVINE"
9: YahooCode = 24544
10: Case "BELLSHILL"
11: YahooCode = 12318
12: Case "CARLISLE"
13: YahooCode = 15178
14: Case "BLAYDON"
15: YahooCode = 13018
16: Case "HULL"
17: YahooCode = 25211
18: Case Else
19: SendIM("Im not able to find the weather for the town you specified (" & locationId & ")")
20: Exit Sub
21: End Select
22: Dim doc As New XPathDocument("http://weather.yahooapis.com/forecastrss?w=" & YahooCode & "&u=c")
23: Dim nav As XPathNavigator = doc.CreateNavigator()
24: Dim ns As New XmlNamespaceManager(nav.NameTable)
25: ns.AddNamespace("yweather", "http://xml.weather.yahoo.com/ns/rss/1.0")
26: Dim nodes As XPathNodeIterator = nav.[Select]("/rss/channel/item/yweather:condition", ns)
27: While (nodes.MoveNext())
28: Dim node As XPathNavigator = nodes.Current
29: SendIM("The weather forecast for " & locationId & " is: " & node.GetAttribute("text", ns.DefaultNamespace).ToString() & ", with a temperature of " & node.GetAttribute("temp", ns.DefaultNamespace).ToString() & "°C")
30: End While
Exit Sub
ErrHand:
SendIM("I can't seem to fetch the weather forecast right now " & Err.Description & " - " & Err.Number & " - " & Erl())
End Sub
As you can see from the code above, I have also built in the functionality for the Lync user to request weather for a couple of locations around the UK. This could be increased to as many as you want, or removed to only send details of one particular place.
Some other things you might want to consider would be for your ‘Bot’ to query a SQL table and pass back the results, or perhaps perform other functionality such as PING a device and send the reply details in an IM.
In a future blog post I will show you how to connect your new ‘BOT’ into a AI handler to provide an AI Bot capable of holding a ‘conversation’ of sorts.
As per my opening paragraph, I am very much in the early days of my Lync development – so if you have any suggestions on how I could improve the code above, please get in touch.
Microsoft have been working on breaking into the iOS market since around November last year, and it looks like we could soon be seeing that ever so popular Office logo in our iOS Device AppStores soon. It’s rumoured, that on launch the iOS variant of the popular app suite will support Word, Excel and PowerPoint files. No news has been released as of yet as to if that will ever been increased to support more Office file types.
The rumours are that interface is similar to that of the desktop variants ‘One Note’, with clear relations to the metro and Windows 8 GUI’s.
It’s going to be interesting to see at which price point Microsoft attack the market at, considering Apples’ own variant have been in the AppStore for sometime now. I am also looking forward to see how well Microsoft integrate cloud based storage and syncing, if nothing else but to judge it against Apple’s iCloud offering.
I’m confident an Android version won’t be far behind…
Using this very simple\straight foreward vbscript, you can cycle through all currently running processes and kill the one you name below.
This can be handy if you have an application/instance which has become non responsive, such as IE when loading flash based pages maybe…
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'iexplore.exe'")
resp = msgbox("All internet explorer windows must be closed in order to continue" & vbCrLf & "Click Yes to close them now or No to cancel", vbYesNo)
For Each objProcess in colProcessList
If resp = vbNo Then
'Nothing To do
Else
objProcess.Terminate()
End If
Next
Despite the fact Windows 7 has been in circulation since before October 2009 there still appears to be no official support for the Microsoft Exchange System Management tools for the Active Directory Users and Computers Microsoft Console applet (dsa.msc).
Luckily there is a work around to enable the installation of Windows Vista Exchange System Management tools on Windows 7.
All you need to do is, download a copy of the MSI from here extract the contents to a folder of your choice, and then run the following from the command line:
MSIEXEC /IESMVISTA.MSI /Q
Doing this will prevent the MSI checking that you are running Windows Vista and should install without any issues.
Restarting Active Directory Users and Computers should enable the add-on and you should now see the additional tabs as pictured in the screen shot above.
Simple really!










