Here is what I am trying to do is create a service that checks if Microsoft Lync is running. If it's running then do nothing but write to eventlog. If it's not running run the exe and then log in to Lync. The problem I am getting is when it comes time to run the exe, it would go and start the process but it never actually runs the app. I tried to see if would work with notepad but all it did was create the process in task manager but never opened the actual app.
Imports System
Imports System.Data
Imports System.Timers
Imports System.Diagnostics
Imports System.Data.SqlClient
Imports System.ServiceProcess
Imports System.Windows.Forms
Public Class Service1
Protected Overrides Sub OnStart(ByVal args() As String)
EventLog.WriteEntry("In Onstart", "starting timer")
Timer1.Start()
End Sub
Protected Overrides Sub OnStop()
End Sub
Private Sub Timer1_Elapsed(ByVal sender As System.Object,
ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
If IsProcessRunning("communicator") Then
EventLog.WriteEntry("no problem")
Else
EventLog.WriteEntry("not running")
Dim info As New ProcessStartInfo("C:\Program Files (x86)\Microsoft Lync\communicator.exe")
info.UseShellExecute = False
info.RedirectStandardError = True
info.RedirectStandardInput = True
info.RedirectStandardOutput = True
info.CreateNoWindow = True
info.ErrorDialog = False
info.WindowStyle = ProcessWindowStyle.Hidden
Dim process__1 As Process = Process.Start(info)
End If
End Sub
Public Function IsProcessRunning(ByVal name As String) As Boolean
For Each clsProcess As Process In Process.GetProcesses()
If clsProcess.ProcessName.StartsWith(name) Then
Return True
End If
Next
Return False
End Function
End Class
Problem comes from the fact that in Windows (and specially since versions 6.x) services run in a completely isolated session and desktop, without any chance of user interaction, which is by design and discouraged to do so, for security reasons. The program you're launching actually does starts, but it does so in that hidden desktop (same for notepad) where no users can ever see it.
The quick and dirty workaround is to mark the service as interactive in the control panel, and start the interactive services detection service. When doing so, when your service runs the program, a window will flash in the taskbar, telling there is a message from a service, so that you can switch to that parallel desktop and actually see it. That's simply very inconvenient to the user and widely considered a BAD PRACTICE.
The real solution is to make the program a regular application and not a service, and run it though some autostart location in Windows for every user. It does not need to have visible UI, but run in the same context as you do. Or to leave the service, but also put some application in user space that communicates with the service just for the sake of running the second program. In any case, the general rule is to never have any kind of user interaction from a service process.
Here is an article that explains the problems and some workarounds http://blogs.technet.com/b/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx