获取Windows服务启动类型?

时间:2015-04-14 06:05:32

标签: .net vb.net windows-services servicecontroller

System.ServiceProcess命名空间中,是否有任何类型的枚举或其他直接成员来确定ServiceController的服务的起始类型(自动,延迟自动,按需,禁用) ?

我们的想法是使用.NET框架类库的该命名空间(或其他命名空间)的可用成员来确定该事物,而不是查看OS注册表或WMI以获取服务的启动类型,因为我可以做到这一点,我只是问.NET框架是否公开了一种更简单的方法来确定那件事。

用VB.Net编写的伪代码,但我也可以管理C#方法:

Public Shared Function GetStartType(ByVal svcName As String) As ServiceControllerStatus

    Dim svc As ServiceController = (From service As ServiceController In ServiceController.GetServices()
         Where service.ServiceName.Equals(svcName, StringComparison.OrdinalIgnoreCase)
        ).FirstOrDefault

    If svc Is Nothing Then
        Throw New ArgumentException("Any service found with the specified name.", "svcName")
    Else
        Using svc
            ' Note that StartTypeEnumValue does not exists.
            Return svc.StartTypeEnumValue
        End Using
    End If

End Function

4 个答案:

答案 0 :(得分:5)

如果可能,将项目目标.NET框架设置为4.6.1或更高版本。 班级ServiceController现在有一个属性StartType

https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller(v=vs.110).aspx

答案 1 :(得分:4)

您可以使用WMI和ManagementObject来实现此目标,基于C# – Get Startup Type of a Service (Windows)

像这样的东西(基于链接文章中的代码)。最初的例子是在C#中,所以我试图快速转换到VB.NET,但语法可能有点不对。我还将方法返回类型修改为String,因为一旦你得到它,我不确定你想要对它做什么。

不要忘记添加Imports System.Management

Public Shared Function GetStartType(ByVal svcName As String) As String

    Dim startMode As String = String.Empty
    Dim filter As String = String.Format("SELECT StartMode FROM Win32_Service WHERE Name = '{0}'", svcName)
    Dim svc As ManagementObjectSearcher = New ManagementObjectSearcher(filter)

    If svc Is Nothing Then
        Throw New ArgumentException("Any service found with the specified name.", paramName:="svcName")
    Else
        Try
            Dim services As ManagementObjectCollection = svc.Get()

            For Each service As ManagementObject In services
                startMode = service.GetPropertyValue("StartMode").ToString()
            Next
        Catch ex As Exception
            ' Do something if needed
        End Try
    End If

    Return StartMode
End Function

答案 2 :(得分:4)

由于我不完全确定我的主要问题(能够获取此信息的.net框架类库中的成员)的答案,我已经开发了这种注册表方法,至少要快得多弄乱了WMI,也可以确定服务是否自动启动延迟。

首先是一个自定义枚举,用于扩展实际的ServiceStartMode枚举:

''' <summary>
''' Indicates the start mode of a service.
''' </summary>
Public Enum SvcStartMode As Integer

    ''' <summary>
    ''' Indicates that the service has not a start mode defined.
    ''' Since a service should have a start mode defined, this means an error occured retrieving the start mode.
    ''' </summary>
    Undefinied = 0

    ''' <summary>
    ''' Indicates that the service is to be started (or was started) by the operating system, at system start-up.
    ''' The service is started after other auto-start services are started plus a short delay.
    ''' </summary>
    AutomaticDelayed = 1

    ''' <summary>
    ''' Indicates that the service is to be started (or was started) by the operating system, at system start-up. 
    ''' If an automatically started service depends on a manually started service, 
    ''' the manually started service is also started automatically at system startup.
    ''' </summary>
    Automatic = 2 'ServiceStartMode.Automatic

    ''' <summary>
    ''' Indicates that the service is started only manually, 
    ''' by a user (using the Service Control Manager) or by an application.
    ''' </summary>
    Manual = 3 'ServiceStartMode.Manual

    ''' <summary>
    ''' Indicates that the service is disabled, so that it cannot be started by a user or application.
    ''' </summary>
    Disabled = 4 ' ServiceStartMode.Disabled

End Enum

其次,这个功能:

''' <summary>
''' Gets the start mode of a service.
''' </summary>
''' <param name="svcName">The service name.</param>
''' <returns>The service's start mode.</returns>
''' <exception cref="ArgumentException">
''' Any service found with the specified name.
''' </exception>
''' <exception cref="Exception">
''' Registry value "Start" not found for service.
''' </exception>
''' <exception cref="Exception">
''' Registry value "DelayedAutoStart" not found for service.
''' </exception>
Public Shared Function GetStartMode(ByVal svcName As String) As SvcStartMode

    Dim reg As RegistryKey = Nothing
    Dim startModeValue As Integer = 0
    Dim delayedAutoStartValue As Integer = 0

    Try
        reg = Registry.LocalMachine.
              OpenSubKey("SYSTEM\CurrentControlSet\Services\" & svcName,
              writable:=False)

        If reg Is Nothing Then
            Throw New ArgumentException("Any service found with the specified name.", 
                                        paramName:="svcName")

        Else
            startModeValue = Convert.ToInt32(reg.GetValue("Start",
                             defaultValue:=-1))

            delayedAutoStartValue = Convert.ToInt32(reg.GetValue("DelayedAutoStart", 
                                    defaultValue:=0))

            If startModeValue = -1 Then
                Throw New Exception(String.Format(
                          "Registry value ""Start"" not found for service '{0}'.", 
                          svcName))

                Return SvcStartMode.Undefinied

            Else
                Return DirectCast(
                       [Enum].Parse(GetType(SvcStartMode),
                                   (startModeValue - delayedAutoStartValue).ToString), 
                                    SvcStartMode)

            End If

        End If

    Catch ex As Exception
        Throw

    Finally
        If reg IsNot Nothing Then
            reg.Dispose()
        End If

    End Try

End Function

答案 3 :(得分:0)

使用
Dim SingleSvc As Object

Dim listaSvcs() As ServiceProcess.ServiceController
Dim SingleSvc As Object
iniservice:
listaSvcs = ServiceProcess.ServiceController.GetServices
Try
    For Each SingleSvc In listaSvcs
        If SingleSvc.ServiceName.IndexOf("postgresql") >= 0 And SingleSvc.StartType.ToString <> "Disabled" Then
            If SingleSvc.Status <> ServiceProcess.ServiceControllerStatus.Running Then
                'MessageBox.Show(SingleSvc.StartType.ToString)
                SingleSvc.Start()
                GoTo iniservice
                End If
            End If
        Next
Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try

在Framework 4中运行 罐