gtag

2012年3月30日 星期五

VB.NET重新啟動Windows服務

平常在寫監控的朋友,一般應該都是使用net start / net stop / net pause / net continue系列的指令,做成批次檔,然後定時來重啟服務。不過工具程式應該要整合這些功能在工具軟體裡,而且重要的一點是,必須將相依的服務一起停止與啟動,讓我們來看看怎麼做:


        Dim Controller As New ServiceController("DHCP Client")
        Dim RunningDService As String = ""
        Dim scServices As ServiceController() = Controller.DependentServices
         '沒有依存的服務
        If scServices.Length = 0 Then
            If Controller.Status = ServiceControllerStatus.Running Then
                Controller.Stop()
                Controller.WaitForStatus(ServiceControllerStatus.Stopped)
                WriteToLog("停止服務 COM+ Event System 成功!!")
            End If
            Controller.Start()
            Controller.WaitForStatus(ServiceControllerStatus.Running)
            '等待啟動成功後再寫LOG
            WriteToLog("啟動服務 COM+ Event System 成功!!")
        Else '有依存服務時需先停止依存服務
            Dim scTemp As ServiceController
            For Each scTemp In scServices
                If scTemp.Status = ServiceControllerStatus.Running Then
                    scTemp.Stop()
                    scTemp.WaitForStatus(ServiceControllerStatus.Stopped)
                    '等待停止成功後再寫LOG
                    WriteToLog("停止相依服務 " & scTemp.DisplayName & " 成功!!")
                    RunningDService = RunningDService & scTemp.DisplayName
                End If
            Next scTemp
            If Controller.Status = ServiceControllerStatus.Running Then
                Controller.Stop()
                Controller.WaitForStatus(ServiceControllerStatus.Stopped)
                '等待停止成功後再寫LOG
                WriteToLog("停止服務 " & Controller.DisplayName & " 成功!!")
            End If
            Controller.Start()
            Controller.WaitForStatus(ServiceControllerStatus.Running)
            WriteToLog("啟動服務 " & Controller.DisplayName & " 成功!!")
            '啟動主要服務後,再啟動依存服務
            For Each scTemp In scServices
                If InStr(RunningDService, scTemp.DisplayName) <> 0 Then
                    scTemp.Start()
                    scTemp.WaitForStatus(ServiceControllerStatus.Running)
                    '等待啟動成功後再寫LOG
                    WriteToLog("啟動相依服務 " & scTemp.DisplayName & " 成功!!")
                End If
            Next scTemp
        End If

以上程式直接放在按鈕的CLICK事件中即可執行,在程式中加了一些註解希望對看倌們有幫助。當然可以更進階的使用,把程式弄成常駐,每隔一段時間去詢問Service的狀態,如果不是已啟動時,使重啟它,這個方法還蠻簡單好用的,筆者常拿來使用。

沒有留言:

張貼留言