Detecta si IIS está habilitado
-
08-07-2019 - |
Pregunta
¿Hay alguna forma de detectar si IIS está habilitado o no?
Sé cómo verificar si está INSTALADO, pero necesito saber si está instalado pero no habilitado.
Además, ¿se puede hacer de forma nativa a través de InstallShield? Verificar esto a través de .NET sería aceptable ya que podemos escribir acciones personalizadas, pero si hay una llamada IS entonces sería ideal.
Cualquier sugerencia / consejo es apreciada, gracias
Solución
También debe verificar si se inicia el sitio web, además del servicio W3svc
c:\Inetpub\scripts>adsutil.vbs get W3SVC/1/ServerState
ServerState : (INTEGER) 2
Donde ServerState =
Value Meaning Friendly ID
1 Starting MD_SERVER_STATE_STARTING
2 Started MD_SERVER_STATE_STARTED <-- What you want
3 Stopping MD_SERVER_STATE_STOPPING
4 Stopped MD_SERVER_STATE_STOPPED
5 Pausing MD_SERVER_STATE_PAUSING
6 Paused MD_SERVER_STATE_PAUSED
7 Continuing MD_SERVER_STATE_CONTINUING
Entonces, la respuesta anterior usando Win32_Service le dirá si el servicio se inició o no, esto le dirá si el sitio web se está ejecutando además de decirle si el servicio se está ejecutando.
Otros consejos
Para verificar el estado del servicio, use el omnipresente WMI (el código es VBScript, solo para darle la idea de la consulta WMI necesaria):
IISrunning = false
wql = "SELECT state FROM Win32_Service WHERE name = 'W3SVC'"
Set w3svc = GetObject("winmgmts://.").ExecQuery(wql)
For Each service in w3svc
IISrunning = (service.State = "Running")
Next
WScript.Echo IISrunning
EDITAR: trato de hacer un script IS a partir de esto. No me pegue si hay un error de sintaxis.
function BOOL DetectIIS()
OBJECT wmi, slist, obj;
NUMBER i;
BOOL IISrunning;
begin
IISrunning = false;
try
set wmi = CoGetObject( "winmgmts://.", "" );
if ( !IsObject(wmi) ) then
MessageBox("Failed to connect to WMI.", WARNING);
return false;
endif;
set slist = wmi.ExecQuery("SELECT state FROM Win32_Service WHERE name = 'W3SVC'");
if ( !IsObject(slist) ) then
MessageBox("Failed to get query W3SVC service state.", WARNING);
return false;
endif;
for i = 0 to slist.Count-1
set obj = slist.Item(i);
IISrunning = (obj.state = "Running");
endfor;
catch
MessageBox(Err.Description, WARNING);
return false;
endcatch;
return IISrunning;
end;
Código prestado de aquí y aquí , porque sé cero sobre el lenguaje de scripting IS. ;-)