none
¿Cómo saber si IIS está instalado? ¿cómo saber si están instaladas las características de 'Restricciones CGI' e 'ISAPI'? RRS feed

  • Pregunta

  • Estoy desarrollando un programa que tiene como objetivo instalar una aplicación web, el programa va a correr en los servidores de mis clientes, el problema es que se cruza con varias configuraciones distintas en cada PC que se ejecuta, 2 de los problemas más comunes son:

    1. El cliente no tiene instalado IIS o el IIS está detenido.
    2. El cliente tiene instalado IIS pero no tiene instaladas las características 'Restricciones CGI/ISAPI'

    El programa del que hablo está programado en vb.net.

    Mi pregunta es: ¿cómo puedo acceder a la lista de características de windows instaladas?, o sino por lo menos, ¿cómo saber si IIS está corriendo, también si está instalado, y a la vez si la característica 'Restricciones CGI/ISAPI' están instaladas?

    ¡Muchas gracias!


    ..::vddcn::..

    • Cambiado Enrique M. Montejo domingo, 2 de noviembre de 2014 8:07 Pregunta relacionada con servidor IIS.
    jueves, 30 de octubre de 2014 14:17

Respuestas

  • Imports WbemScripting
    Imports System.Collections
    
    Public Class w3svc
    Function ListarComponentesInstalados(Optional ByRef FunctionError As Boolean = False, Optional ByRef FunctionErrorMsg As String = "") As List(Of Componente)
    		On Error Resume Next
    
    		Const wbemFlagReturnImmediately = &H10
    		Const wbemFlagForwardOnly = &H20
    
    		Dim objWMIService As SWbemServicesEx
    		Dim colItems As SWbemObjectSet
    		Dim objItem As SWbemObjectEx
    		Dim Componente As Componente
    		Dim IEnum As IEnumerator
    
    		ListarComponentesInstalados = New List(Of Componente)
    
    		objWMIService = DirectCast(GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2"), SWbemServicesEx)
    		colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OptionalFeature", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
    
    		IEnum = colItems.GetEnumerator
    		IEnum.MoveNext()
    		While IEnum.Current IsNot Nothing
    			objItem = DirectCast(IEnum.Current, SWbemObjectEx)
    
    			Componente = New Componente
    			If objItem.InstallState = 1 Then
    				Componente.pHabilitado = True
    			Else
    				Componente.pHabilitado = False
    			End If
    			Componente.pNombre = objItem.Name
    			Componente.pDescripcion = objItem.Caption
    			ListarComponentesInstalados.Add(Componente)
    
    			IEnum.MoveNext()
    		End While
    
    		If Err.Number > 0 Then
    			FunctionError = True
    			FunctionErrorMsg = "Error: " & Err.Number & " - " & Err.Description
    		End If
    	End Function
    End Class
    
    Public Class Componente
        Friend pNombre As String
        Friend pDescripcion As String
    	Friend pHabilitado As Boolean
    
    	ReadOnly Property Nombre As String
    		Get
    			Nombre = pNombre
    		End Get
        End Property
    
        ReadOnly Property Descripcion As String
            Get
                Descripcion = pDescripcion
            End Get
        End Property
    
        ReadOnly Property Habilitado As Boolean
            Get
                Habilitado = pHabilitado
            End Get
        End Property
    End Class

    Este es el código  que usé para saber cuáles son los componentes instalados en windows (En Windows XP no funciona, en Windows 7 y 8 sí, no probé en Windows Vista ni en Windows Server 2008)

    Para que el código funcione se debe importar la librería COM 'Microsoft WMI Scripting V1.2 Library'

    ___

    Para saber si el IIS está corriendo o detenido es otro tema, para empezar obligo al cliente a tener las características de compatibilidad con IIS 6.0 habilitadas, luego en la carpeta %SystemDrive%\inetpub\AdminScripts se encuentra el archivo 'adsutil.vbs'.

    Con el comando 'get' de adsutil puedo consultar la propiedad 'ServerState' de cada sitio, y saber si está corriendo o no el sitio. (Valores de la propiedad ServerState de IIS)

    'adsutil.vbs' se utiliza de la siguiente manera: "cscript adsutil.vbs get w3svc/1/ServerState"

    • Se ejecuta desde el símbolo de sistema
    • '1' es el número que identifica al sitio (se puede ejecutar "cscript adsutil.vbs enum w3svc" para ver todos los sitios)
    • 'ServerState' es la propiedad de la que hablaba anteriormente

    Con esto es suficiente para realizar lo que necesitaba.

    ___

    ¿Por qué no usé lo recomendado por Jose Luque Ballesteros?

    El IIS puede estar detenido, sin embargo el servicio "World Wide Web Publishing Service", "IISADMIN" y "W3SVC" siguen corriendo. Por lo que siempre me devuelve que está en estado 'Running' aunque el IIS esté detenido, claro está que si detenemos alguno de estos servicios el IIS queda detenido automáticamente, pero no es lo que buscaba. De todas formas me ayudó, ¡Muchas gracias Jose!

    ___


    ..::vddcn::..

    • Marcado como respuesta Víctor da Cunha miércoles, 5 de noviembre de 2014 12:45
    miércoles, 5 de noviembre de 2014 12:43

Todas las respuestas

  • Sí, eso yo sé como hacerlo y lo tengo claro.

    Pero necesito hacerlo desde vb.net, no a mano, ya que es el cliente el que utiliza el programa para instalar la aplicación web en su servidor.


    ..::vddcn::..

    jueves, 30 de octubre de 2014 15:00
  • En cuento a verificar si el IIS se encuentra o no instalado y en funcionamiento puedes probar con:

    Dim sc As New ServiceController("World Wide Web Publishing Service")
    If (sc.Status.Equals(ServiceControllerStatus.Stopped) OrElse sc.Status.Equals(ServiceControllerStatus.StopPending)) Then
    	Console.WriteLine("IIS is stopped...")
    sc.Start()
    End If

    Un saludo


    Si se solucionó tu consulta, no olvides marcarla como respondida. Si te ayudó, vótala como útil.

    jueves, 30 de octubre de 2014 15:03
  • Imports WbemScripting
    Imports System.Collections
    
    Public Class w3svc
    Function ListarComponentesInstalados(Optional ByRef FunctionError As Boolean = False, Optional ByRef FunctionErrorMsg As String = "") As List(Of Componente)
    		On Error Resume Next
    
    		Const wbemFlagReturnImmediately = &H10
    		Const wbemFlagForwardOnly = &H20
    
    		Dim objWMIService As SWbemServicesEx
    		Dim colItems As SWbemObjectSet
    		Dim objItem As SWbemObjectEx
    		Dim Componente As Componente
    		Dim IEnum As IEnumerator
    
    		ListarComponentesInstalados = New List(Of Componente)
    
    		objWMIService = DirectCast(GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2"), SWbemServicesEx)
    		colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OptionalFeature", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
    
    		IEnum = colItems.GetEnumerator
    		IEnum.MoveNext()
    		While IEnum.Current IsNot Nothing
    			objItem = DirectCast(IEnum.Current, SWbemObjectEx)
    
    			Componente = New Componente
    			If objItem.InstallState = 1 Then
    				Componente.pHabilitado = True
    			Else
    				Componente.pHabilitado = False
    			End If
    			Componente.pNombre = objItem.Name
    			Componente.pDescripcion = objItem.Caption
    			ListarComponentesInstalados.Add(Componente)
    
    			IEnum.MoveNext()
    		End While
    
    		If Err.Number > 0 Then
    			FunctionError = True
    			FunctionErrorMsg = "Error: " & Err.Number & " - " & Err.Description
    		End If
    	End Function
    End Class
    
    Public Class Componente
        Friend pNombre As String
        Friend pDescripcion As String
    	Friend pHabilitado As Boolean
    
    	ReadOnly Property Nombre As String
    		Get
    			Nombre = pNombre
    		End Get
        End Property
    
        ReadOnly Property Descripcion As String
            Get
                Descripcion = pDescripcion
            End Get
        End Property
    
        ReadOnly Property Habilitado As Boolean
            Get
                Habilitado = pHabilitado
            End Get
        End Property
    End Class

    Este es el código  que usé para saber cuáles son los componentes instalados en windows (En Windows XP no funciona, en Windows 7 y 8 sí, no probé en Windows Vista ni en Windows Server 2008)

    Para que el código funcione se debe importar la librería COM 'Microsoft WMI Scripting V1.2 Library'

    ___

    Para saber si el IIS está corriendo o detenido es otro tema, para empezar obligo al cliente a tener las características de compatibilidad con IIS 6.0 habilitadas, luego en la carpeta %SystemDrive%\inetpub\AdminScripts se encuentra el archivo 'adsutil.vbs'.

    Con el comando 'get' de adsutil puedo consultar la propiedad 'ServerState' de cada sitio, y saber si está corriendo o no el sitio. (Valores de la propiedad ServerState de IIS)

    'adsutil.vbs' se utiliza de la siguiente manera: "cscript adsutil.vbs get w3svc/1/ServerState"

    • Se ejecuta desde el símbolo de sistema
    • '1' es el número que identifica al sitio (se puede ejecutar "cscript adsutil.vbs enum w3svc" para ver todos los sitios)
    • 'ServerState' es la propiedad de la que hablaba anteriormente

    Con esto es suficiente para realizar lo que necesitaba.

    ___

    ¿Por qué no usé lo recomendado por Jose Luque Ballesteros?

    El IIS puede estar detenido, sin embargo el servicio "World Wide Web Publishing Service", "IISADMIN" y "W3SVC" siguen corriendo. Por lo que siempre me devuelve que está en estado 'Running' aunque el IIS esté detenido, claro está que si detenemos alguno de estos servicios el IIS queda detenido automáticamente, pero no es lo que buscaba. De todas formas me ayudó, ¡Muchas gracias Jose!

    ___


    ..::vddcn::..

    • Marcado como respuesta Víctor da Cunha miércoles, 5 de noviembre de 2014 12:45
    miércoles, 5 de noviembre de 2014 12:43