This is a simple Windows Service controller module (missing some forms). If features the ability to control a service on another, remote computer, if you have access and the Remote Registry Service is running.
Imports System.Diagnostics
Imports System.Drawing
Imports System.ServiceProcess
Imports System.Configuration
Imports System.Configuration.ConfigurationSettings
Imports Microsoft.Win32

Module controller_main

#Region " Global Vars "
    Private WithEvents niMain As NotifyIcon
    Private WithEvents cmMain As ContextMenu
    Private WithEvents timerMain As Timers.Timer
    Private controller As ServiceController

    Private icoPaused As Icon
    Private icoRunning As Icon
    Private icoStopped As Icon
    Private icoRunningPoll As Icon
    Private icoPausedPoll As Icon
    Private icoStoppedPoll As Icon
    Private icoDisabled As Icon
    Private pollingicon As Icon

    Private WithEvents timerPoll As Timers.Timer
    Private updatingStatus As ServiceControllerStatus
    Private bRestart As Boolean = False

    Private frmCfg As frmConfig
    Private frmSts As frmStatus

    Public strServerName As String = LOCALMACHINE
    Public strServerAppPath As String = Application.StartupPath
#End Region

#Region " Application Main and Exit "
    Public Sub main()
        Dim teststr As String
        Dim firstInstance As Boolean
        Dim mtx As System.Threading.Mutex

        'see if controller is already running using named mutex
        Try
            mtx = New System.Threading.Mutex(False, MUTEXNAME, firstInstance)
            If Not firstInstance Then
                Exit Sub
            End If
        Catch ex As Exception
            MsgBox("Error starting application: " & ex.Message, MsgBoxStyle.Critical)
            Exit Sub
        End Try

        Try
            SetupApp()
            If CheckServiceInstalled(strServerName, Nothing) = constants.SERVICEINSTALLED.INSTALLED Then
                controller = New ServiceController(SERVICENAME, strServerName)
            ElseIf Not REMOTESERVERS Then
                MsgBox("The " & SERVICEDISPLAYNAME & " is not installed on this machine.  Please install it and try again.")
                ExitController(Nothing, Nothing)
                Exit Sub
            End If
            'If Not REMOTESERVERS Then
            '    Try
            '        teststr = controller.ServiceName
            '    Catch ex As Exception
            '        If Not IsNothing(ex.InnerException) AndAlso ex.InnerException.GetType.Equals(GetType(System.ComponentModel.Win32Exception)) _
            '                AndAlso CType(ex.InnerException, System.ComponentModel.Win32Exception).NativeErrorCode = WIN32SERVICEERROR Then
            '            MsgBox("The " & SERVICEDISPLAYNAME & " is not installed on this machine.  Please install it and try again.")
            '            ExitController(Nothing, Nothing)
            '            Exit Sub
            '        End If
            '    End Try
            'End If
            GetServiceStatus()

            'make sure mtx isn't garbage collected
            GC.KeepAlive(mtx)
            Application.Run()
        Catch ex As Exception
            'if this error is caused by the service having been uninstalled
            'if local, just exit; if remote disable controller
            If Not IsNothing(ex.InnerException) AndAlso ex.InnerException.GetType.Equals(GetType(System.ComponentModel.Win32Exception)) _
                    AndAlso CType(ex.InnerException, System.ComponentModel.Win32Exception).NativeErrorCode = WIN32SERVICEERROR Then
                If strServerName = LOCALMACHINE Then
                    ExitController(Nothing, Nothing)
                    Exit Sub
                Else

                End If
            Else
                MsgBox(ex.Message, MsgBoxStyle.Critical)
            End If
        End Try
    End Sub

    Private Sub ExitController(ByVal sender As Object, ByVal e As EventArgs)
        If Not IsNothing(timerMain) Then
            timerMain.Enabled = False
            timerMain.Dispose()
        End If
        If Not IsNothing(frmCfg) Then
            frmCfg.Close()
        End If
        If Not IsNothing(frmSts) Then
            frmSts.Close()
        End If
        If Not IsNothing(niMain) Then
            niMain.Visible = False
            niMain.Dispose()
        End If
        If Not IsNothing(controller) Then
            controller.Dispose()
        End If
        Application.Exit()
    End Sub

#End Region

#Region " Initialization functions "
    Private Sub SetupApp()
        icoDisabled = New Icon(GetType(frmConfig), "disabled.ico")
        icoPaused = New Icon(GetType(frmConfig), "paused.ico")
        icoRunning = New Icon(GetType(frmConfig), "running.ico")
        icoStopped = New Icon(GetType(frmConfig), "stopped.ico")
        icoPausedPoll = New Icon(GetType(frmConfig), "pausedpoll.ico")
        icoRunningPoll = New Icon(GetType(frmConfig), "runningpoll.ico")
        icoStoppedPoll = New Icon(GetType(frmConfig), "stoppedpoll.ico")

        If REMOTESERVERS Then
            If Not IsNothing(AppSettings("LastServer")) AndAlso AppSettings("LastServer") <> "" Then
                strServerName = AppSettings("LastServer")
            End If
        End If

        niMain = New NotifyIcon
        niMain.Icon = icoDisabled
        niMain.Text = SERVICEDISPLAYNAME
        niMain.Visible = False
        cmMain = New ContextMenu
        CreateMenu()
        niMain.ContextMenu = cmMain
        SetupTimer()
        niMain.Visible = True

    End Sub

    Private Sub CreateMenu()
        cmMain.MenuItems.Add(New MenuItem("Stop", New EventHandler(AddressOf StopService)))
        cmMain.MenuItems.Add(New MenuItem("Start", New EventHandler(AddressOf StartService)))
        cmMain.MenuItems.Add("-")
        If REMOTESERVERS Then
            cmMain.MenuItems.Add(BuildServerSubMenu())
        End If
        cmMain.MenuItems.Add(New MenuItem("Configuration", AddressOf ShowConfig))
        cmMain.MenuItems.Add(New MenuItem("Status", AddressOf ShowStatus))
        cmMain.MenuItems.Add(New MenuItem("Exit", AddressOf ExitController))
        cmMain.MenuItems(cmMain.MenuItems.Count - 2).DefaultItem = True
    End Sub

    Private Sub SetupTimer()
        If IsNothing(timerPoll) Then
            timerPoll = New Timers.Timer
        End If
        timerPoll.Interval = TIMERPOLLDELAY
        timerPoll.AutoReset = False
        If IsNothing(timerMain) Then
            timerMain = New Timers.Timer
        End If
        timerMain.Interval = TIMERPOLLNORMAL
        timerMain.AutoReset = False
    End Sub

#End Region

#Region " System Tray and Context Menu handlers "
    Private Sub niMain_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles niMain.DoubleClick
        ShowStatus(Nothing, Nothing)
    End Sub

    Private Sub ChangeNotifyIcon(ByVal newicon As Icon, ByVal desc As String)

    End Sub
#End Region

#Region " Service Management functions "
    Private Sub StopService(ByVal sender As Object, ByVal e As EventArgs)
        controller.Refresh()
        If controller.CanStop AndAlso controller.Status.Equals(ServiceControllerStatus.Running) Then
            updatingStatus = ServiceControllerStatus.Stopped
            cmMain.MenuItems(0).Enabled = False
            timerMain.Interval = TIMERPOLLFAST
            controller.Stop()
        End If
    End Sub

    Private Sub StartService(ByVal sender As Object, ByVal e As EventArgs)
        controller.Refresh()
        If controller.Status.Equals(ServiceControllerStatus.Stopped) Then
            updatingStatus = ServiceControllerStatus.Running
            cmMain.MenuItems(1).Enabled = False
            timerMain.Interval = TIMERPOLLFAST
            controller.Start()
        End If
    End Sub

    Private Sub RestartService()
        bRestart = True
        updatingStatus = ServiceControllerStatus.Stopped
        StopService(Nothing, Nothing)
        timerMain.Interval = TIMERPOLLFAST
    End Sub

    Private Sub GetServiceStatus()
        Static updatingElapsed As Integer
        controller.Refresh()
        If controller.Status = updatingStatus Then
            If bRestart Then
                bRestart = False
                updatingStatus = ServiceControllerStatus.Running
                StartService(Nothing, Nothing)
            Else
                timerMain.Interval = TIMERPOLLNORMAL
                updatingStatus = Nothing
            End If
            updatingElapsed = 0
        End If
        If Not IsNothing(updatingStatus) AndAlso updatingStatus <> 0 Then
            updatingElapsed += timerMain.Interval
            If updatingElapsed >= STARTSTOPTIMEOUT Then
                If updatingStatus = ServiceControllerStatus.Stopped Then
                    MsgBox("The service did not stop in a reasonable amount of time.  Please check the event log and try again.")
                Else
                    MsgBox("The service did not start in a reasonable amount of time.  Please check the event log and try again.")
                End If
                updatingElapsed = 0
                updatingStatus = Nothing
                timerMain.Interval = TIMERPOLLNORMAL
            End If
        End If
        Select Case controller.Status()
            Case ServiceControllerStatus.Running
                niMain.Icon = icoRunning
                pollingicon = icoRunningPoll
                niMain.Text = SERVICEDISPLAYNAME & " (Running)"
                cmMain.MenuItems(0).Enabled = (updatingStatus <> ServiceControllerStatus.Stopped)
                cmMain.MenuItems(1).Enabled = False
            Case ServiceControllerStatus.Stopped
                niMain.Icon = icoStopped
                pollingicon = icoStoppedPoll
                niMain.Text = SERVICEDISPLAYNAME & " (Stopped)"
                cmMain.MenuItems(0).Enabled = False
                cmMain.MenuItems(1).Enabled = (updatingStatus <> ServiceControllerStatus.Running)
            Case ServiceControllerStatus.ContinuePending, _
                    ServiceControllerStatus.PausePending, _
                    ServiceControllerStatus.StartPending, _
                    ServiceControllerStatus.StopPending, _
                    ServiceControllerStatus.Paused
                niMain.Icon = icoPaused
                pollingicon = icoPausedPoll
                niMain.Text = SERVICEDISPLAYNAME & " (Paused)"
                cmMain.MenuItems(0).Enabled = False
                cmMain.MenuItems(1).Enabled = False
        End Select
        timerMain.Start()
    End Sub

#End Region

#Region " Config and Status functions "
    Private Sub ShowConfig(ByVal sender As Object, ByVal e As EventArgs)
        If IsNothing(frmCfg) Then
            frmCfg = New frmConfig
        End If
        If Not IsNothing(frmSts) AndAlso frmSts.Visible Then
            frmSts.Hide()
        End If
        If Not frmCfg.Visible Then
            If frmCfg.ShowDialog = DialogResult.Retry Then
                controller.Refresh()
                If controller.Status = ServiceControllerStatus.Running Then
                    If MsgBox("The service will need to be restarted for your changes to take effect.  Restart the service now?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
                        RestartService()
                    End If
                End If
            End If
        Else
            frmCfg.Activate()
        End If
    End Sub

    Private Sub ShowStatus(ByVal sender As Object, ByVal e As EventArgs)
        If IsNothing(frmSts) Then
            frmSts = New frmStatus
        End If
        If frmSts.LoadStatus Then
            If Not frmSts.Visible Then
                frmSts.Show()
            Else
                frmSts.Activate()
            End If
        End If
    End Sub

#End Region

#Region " Timer handlers "
    Private Sub timerMain_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles timerMain.Elapsed
        niMain.Icon = pollingicon
        timerPoll.Start()
    End Sub

    Private Sub timerPoll_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles timerPoll.Elapsed
        Try
            GetServiceStatus()
        Catch ex As Exception
            ExitController(Nothing, Nothing)
            Exit Sub
        End Try
    End Sub

    Private Sub SuspendTimers()
        timerPoll.Stop()
        timerMain.Stop()
    End Sub
#End Region

#Region " Remote Server handling functions "
    Private Sub ChangeServer(ByVal sender As Object, ByVal e As EventArgs)
        Dim newServer As String
        SuspendTimers()
        newServer = CType(sender, MenuItem).Text
        CheckServiceInstalled(newServer, Nothing)
        'change controller to look at new server
        'start process
        ChangeController()
        GetServiceStatus()
    End Sub

    Private Function IsLocalMachine(ByVal servername As String) As Boolean
        Return (servername.ToUpper = Environment.MachineName.ToUpper OrElse servername = LOCALMACHINE)
    End Function

    Private Function CheckServiceInstalled(ByVal serverName As String, ByRef servicepath As String) As SERVICEINSTALLED
        Dim regKey As RegistryKey
        Dim elKey As RegistryKey
        Dim bLocal As Boolean

        Try
            'first check to see if serverName is actually local machine
            bLocal = IsLocalMachine(serverName)
            If bLocal Then
                elKey = Registry.LocalMachine.OpenSubKey(SERVICEREGISTRYKEY & SERVICENAME)
            Else
                regKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, serverName)
                elKey = regKey.OpenSubKey(SERVICEREGISTRYKEY & SERVICENAME)
            End If
            If IsNothing(elKey) Then
                regKey.Close()
                Return constants.SERVICEINSTALLED.NOTINSTALLED
            Else
                If Not IsNothing(servicepath) Then
                    servicepath = IIf(bLocal, Application.StartupPath, elKey.GetValue("ImagePath"))
                End If
                Return constants.SERVICEINSTALLED.INSTALLED
            End If
        Catch secex As Security.SecurityException
            Return constants.SERVICEINSTALLED.NOACCESS
        Catch ioex As IO.IOException
            Return constants.SERVICEINSTALLED.NOSERVER
        Finally
            If Not IsNothing(elKey) Then
                elKey.Close()
            End If
            If Not IsNothing(regKey) Then
                regKey.Close()
            End If
        End Try
    End Function

    Private Sub ChangeController()
        controller.Dispose()
        controller = New ServiceController(SERVICENAME, strServerName)
    End Sub

    Private Sub SelectNewServer(ByVal sender As Object, ByVal e As EventArgs)
        Dim newServer As String
        Dim servpath As String
        Dim result As SERVICEINSTALLED

        newServer = InputBox("Please enter the name of the server:")
        If newServer.Trim <> "" Then
            'verify server exists and we have access to it
            result = CheckServiceInstalled(newServer, servpath)
            Select Case result
                Case constants.SERVICEINSTALLED.INSTALLED
                    'change to that server
                    strServerName = newServer
                    ChangeController()
                    'add server to list and show it checked
                    'add server to config file server list and last used server
                    AddNewServer(newServer)
                Case constants.SERVICEINSTALLED.NOACCESS
                    MsgBox("You do not have access to the server " & newServer.ToUpper)
                Case constants.SERVICEINSTALLED.NOSERVER
                    MsgBox("The server " & newServer.ToUpper & " does not exist.")
                Case constants.SERVICEINSTALLED.NOTINSTALLED
                    If IsLocalMachine(newServer) Then
                        MsgBox("The " & SERVICEDISPLAYNAME & " is not installed on this machine.  Please install it and try again.")
                    Else
                        MsgBox("The " & SERVICEDISPLAYNAME & " is not installed on server " & newServer.ToUpper & ".  Please install it and try again.")
                    End If
                Case Else
                    MsgBox("There was a problem connecting to the specified server.")
            End Select
        End If
    End Sub

    Private Function AddNewServer(ByVal newServer As String)
        Dim miServer As MenuItem
        Dim appServers As Collections.Specialized.NameValueCollection
        Dim configServer As String
        Dim bFoundMenu As Boolean = False
        Dim bFoundConfig As Boolean = False

        AppSettings("LastServer") = newServer.ToUpper
        appServers = ConfigurationSettings.GetConfig("appServers")
        'find servername in submenu and check it, uncheck all others
        For Each miServer In cmMain.MenuItems(3).MenuItems
            If Not bFoundMenu Then
                bFoundMenu = (miServer.Text.ToUpper = newServer.ToUpper)
                miServer.Checked = bFoundMenu
            Else
                miServer.Checked = False
            End If
        Next
        For Each configServer In appServers
            If appServers(configServer).ToUpper = newServer.ToUpper Then
                bFoundConfig = True
                Exit For
            End If
        Next
        If Not bFoundMenu Then
            cmMain.MenuItems(3).MenuItems.Add(New MenuItem(newServer.ToUpper, AddressOf ChangeServer))
        End If
        If Not bFoundConfig Then
            appServers.Add(newServer, newServer.ToUpper)
        End If
    End Function

    Private Function BuildServerSubMenu() As MenuItem
        Dim srvMenu As MenuItem
        Dim appServers As Collections.Specialized.NameValueCollection
        Dim configServer As String
        Dim newmi As MenuItem

        srvMenu = New MenuItem("Select Server")
        srvMenu.MenuItems.Add(New MenuItem("Local Machine", AddressOf ChangeServer))
        Try
            appServers = ConfigurationSettings.GetConfig("appServers")
            If IsNothing(appServers) Then
                srvMenu.MenuItems(0).Checked = True
            Else
                For Each configServer In appServers
                    newmi = New MenuItem(appServers(configServer), AddressOf ChangeServer)
                    newmi.Checked = (strServerName = appServers(configServer))
                    srvMenu.MenuItems.Add(newmi)
                Next
            End If
        Catch ex As Exception

        End Try
        srvMenu.MenuItems.Add("-")
        srvMenu.MenuItems.Add(New MenuItem("Select another server...", AddressOf SelectNewServer))
        srvMenu.MenuItems.Add(New MenuItem("Clear Server List", AddressOf ClearServerList))
        Return srvMenu
    End Function

    Private Sub ClearServerList(ByVal sender As Object, ByVal e As EventArgs)

    End Sub

#End Region

End Module