Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Ver estado, cambiar estado cortafuegos (firewall) de Windows
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Ver estado, cambiar estado cortafuegos (firewall) de Windows

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Ver estado, cambiar estado cortafuegos (firewall) de Windows Responder citando

¿Puedo saber el estado (si está iniciado o detenido) del cortafuegos (firewall) de Windows desde una aplicación realizada en Delphi? ¿puedo iniciarlo o detenerlo?

Utilizo Borland Delphi 6 y Windows XP SP3.
MensajePublicado:
Mar May 26, 2009 5:54 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Ver estado, cambiar estado cortafuegos (firewall) de Win Responder citando



Anuncios



varios escribió:
¿Puedo saber el estado (si está iniciado o detenido) del cortafuegos (firewall) de Windows desde una aplicación realizada en Delphi? ¿puedo iniciarlo o detenerlo?

Utilizo Borland Delphi 6 y Windows XP SP3.


Sí, por supuesto, el cortafuegos de Windows es un servicio, llamado "SharedAccess", es suficiente con ver el estado, iniciarlo o detenerlo.

A continuación te mostramos el código fuente de una de nuestras aplicaciones, que realiza estas acciones que nos comentas. La descarga gratuita del código fuente 100% Open Source:

http://www.ajpdsoft.com/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=234

El código fuente (ahí verás las funciones para iniciar, detener y ver el estado de un servicio de Windows):

Código:

unit UnidadMenuPrincipal;

{$R WinXP.res}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, shellapi, winsvc, ExtCtrls, ComCtrls, ThemeMgr, inifiles;

type
  TformMenuPrincipal = class(TForm)
    bDesactivarCortafuegos: TButton;
    GroupBox1: TGroupBox;
    lEstado: TLabel;
    bIniciar: TButton;
    Label1: TLabel;
    lInfo: TStaticText;
    Shape1: TShape;
    bActualizar: TButton;
    bSalir: TButton;
    be: TStatusBar;
    Label2: TLabel;
    txtNombreServicio: TEdit;
    ThemeManager1: TThemeManager;
    procedure bDesactivarCortafuegosClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure estadoCortafuegos ();
    procedure bActualizarClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure bIniciarClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    nombreServicio : string;   

  public
    { Public declarations }
  end;

var
  formMenuPrincipal: TformMenuPrincipal;

implementation

{$R *.dfm}

// Inicia un servicio de Windows
function iniciarServicio (equipo, servicio : string) : Boolean;
var
  schm,
  schs: SC_Handle;
  ss: TServiceStatus;
  psTemp: PChar;
  dwChkP: DWord;
begin
  ss.dwCurrentState := 0;
  schm := OpenSCManager(PChar(equipo), nil, SC_MANAGER_CONNECT);
  if (schm > 0) then
  begin
    schs := OpenService(schm, PChar(servicio), SERVICE_START or
      SERVICE_QUERY_STATUS);
    if (schs > 0) then
    begin
      psTemp := nil;
      if (StartService(schs, 0, psTemp)) then
        if (QueryServiceStatus(schs, ss)) then
          while (SERVICE_RUNNING <> ss.dwCurrentState) do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if (not QueryServiceStatus(schs, ss)) then
              Break;
            if (ss.dwCheckPoint < dwChkP) then
              Break;
          end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_RUNNING = ss.dwCurrentState;
end;

// Detiene un servicio de Windows
function detenerServicio (equipo, servicio : String) : Boolean;
var
  schm,
  schs: SC_Handle;
  ss: TServiceStatus;
  dwChkP: DWord;
begin
  schm := OpenSCManager(PChar(equipo), nil, SC_MANAGER_CONNECT);
  if (schm>0) then
  begin
    schs := OpenService(schm, PChar(servicio), SERVICE_STOP or
      SERVICE_QUERY_STATUS);
    if (schs>0) then
    begin
      if (ControlService(schs, SERVICE_CONTROL_STOP, ss)) then
        if (QueryServiceStatus(schs, ss)) then
          while (SERVICE_STOPPED<>ss.dwCurrentState) do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if (not QueryServiceStatus(schs, ss)) then
              Break;
            if (ss.dwCheckPoint < dwChkP) then
              Break;
          end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_STOPPED=ss.dwCurrentState;
end;



// Obtiene el estado de un servicio
function estadoServicio(sPC, sServicio : string ) : string;
var
  schm, schs   : SC_Handle;
  ss     : TServiceStatus;
  dwStat : DWord;
begin
  dwStat := 0;
  schm := OpenSCManager(PChar(sPC), Nil, SC_MANAGER_CONNECT);
  if (schm > 0) then
  begin
    schs := OpenService(schm, PChar(sServicio), SERVICE_QUERY_STATUS);
    if (schs > 0) then
    begin
      if (QueryServiceStatus(schs, ss)) then
      begin
        dwStat := ss.dwCurrentState;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  case dwStat of
    0 : Result := 'No disponible';
    1 : Result := 'Detenido';
    2 : Result := 'Iniciando';
    3 : Result := 'Deteniendo';
    4 : Result := 'Iniciado';
    7 : Result := 'Pausado';
  else
    result := inttostr(dwstat);
  end;
end;

// Lee una cadena de texto de un INI
function leCadINI (clave, cadena : string; defecto : string) : string;
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    result := readString (clave, cadena, defecto);
  finally
    free;
  end;
end;

//escribe una cadena de texto en un INI
procedure esCadINI (clave, cadena, valor : string);
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    writeString (clave, cadena, valor);
  finally
    free;
  end;
end;

procedure TformMenuPrincipal.estadoCortafuegos ();
begin
  lEstado.Caption := estadoServicio('', txtNombreServicio.Text);
  if (lEstado.Caption = 'Detenido') or (lEstado.Caption = 'Pausado') or
     (lEstado.Caption = 'No disponible') then
  begin
    lInfo.Caption := 'Anteción: el cortafuegos (firewall) de Windows está ' +
        'detenido, si no tiene un antivirus o cortafuegos actívelo para evitar ' +
        'posibles intrusiones de virus y demás.';
    lInfo.Font.Color := clMaroon;
    bIniciar.Enabled := true;
    bDesactivarCortafuegos.Enabled := false;
  end
  else
  begin
    lInfo.Caption := 'El cortafuegos (firewall) de Windows está ' +
        'iniciado.';
    lInfo.Font.Color := clGreen;
    bIniciar.Enabled := false;
    bDesactivarCortafuegos.Enabled := true;
  end;
end;

procedure TformMenuPrincipal.bDesactivarCortafuegosClick(Sender: TObject);
begin
  nombreServicio := txtNombreServicio.Text;
  Cursor := crHourGlass;
  be.Panels[0].Text := 'Deteniendo servicio ' + nombreServicio + ', espere por favor';
  be.Refresh;
  bActualizar.Enabled := false;
  bIniciar.Enabled := false;
  bSalir.Enabled := false;
  bDesactivarCortafuegos.Enabled := false;
  if detenerServicio ('', nombreServicio) then
    be.Panels[0].Text := 'Servicio ' + nombreServicio + ' detenido'
  else
    be.Panels[0].Text := 'Error al detener el servicio ' + nombreServicio;
  bActualizarClick(Self);
  bSalir.Enabled := true;
  bActualizar.Enabled := true;
  Cursor := crDefault;
end;

procedure TformMenuPrincipal.FormCreate(Sender: TObject);
var
  parametro1, parametro2 : string;
begin
  txtNombreServicio.Text := leCadINI('Configuración', 'Nombre servicio', 'SharedAccess');
  if ParamCount >= 1 then
  begin
    parametro1 := ParamStr(1);
    parametro2 := ParamStr(2);
    if (AnsiUpperCase (parametro1) = 'I') or
        (AnsiUpperCase (parametro1) = '-I') or
        (AnsiUpperCase (parametro1) = '/I') then
      bIniciarClick(Self);
    if (AnsiUpperCase (parametro1) = 'D') or
        (AnsiUpperCase (parametro1) = '-D') or
        (AnsiUpperCase (parametro1) = '/D') then
      bDesactivarCortafuegosClick(Self);
    if (AnsiUpperCase (parametro2) = 'C') or
        (AnsiUpperCase (parametro2) = '-C') or
        (AnsiUpperCase (parametro2) = '/C') then
    begin
      Application.Terminate;
      Close;
    end;
  end;
  estadoCortafuegos();
end;

procedure TformMenuPrincipal.bActualizarClick(Sender: TObject);
begin
  nombreServicio := txtNombreServicio.Text;
  estadoCortafuegos ();
end;

procedure TformMenuPrincipal.bSalirClick(Sender: TObject);
begin
  close;
end;

procedure TformMenuPrincipal.bIniciarClick(Sender: TObject);
begin
  nombreServicio := txtNombreServicio.Text;
  Cursor := crHourGlass;
  be.Panels[0].Text := 'Iniciando servicio ' + nombreServicio + ', espere por favor';
  be.Refresh;
  bActualizar.Enabled := false;
  bIniciar.Enabled := false;
  bSalir.Enabled := false;
  bDesactivarCortafuegos.Enabled := false;
  if iniciarServicio('', nombreServicio) then
    be.Panels[0].Text := 'Servicio iniciado'
  else
    be.Panels[0].Text := 'Error al iniciar servicio';
  bActualizarClick(Self);
  bSalir.Enabled := true;
  bActualizar.Enabled := true;
  Cursor := crDefault;
end;

procedure TformMenuPrincipal.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  esCadINI('Configuración', 'Nombre servicio', txtNombreServicio.Text);
end;

end.
MensajePublicado:
Mar May 26, 2009 5:59 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Ver estado, cambiar estado cortafuegos (firewall) de Win Responder citando



Anuncios



alonsojpd escribió:
Sí, por supuesto, el cortafuegos de Windows es un servicio, llamado "SharedAccess", es suficiente con ver el estado, iniciarlo o detenerlo.

A continuación te mostramos el código fuente de una de nuestras aplicaciones, que realiza estas acciones que nos comentas. La descarga gratuita del código fuente 100% Open Source...


Ten en cuenta que lo que te hemos indicado anteriormete es para el servicio del cortafuegos de Windows, además de esto, el propio cortafuegos puede estar activado o desactivado (independientemente de como esté el servicio). Lógicamente, si el servicio está detenido el cortafuegos también lo estará, pero puede que el servicio esté iniciado y el cortafuegos detenido.

A continuación te mostramos el código fuente de una de nuestras aplicaciones, en este código verás funciones para iniciar, detener el firewall de Windows, también verás funciones para añadir reglas al cortafuegos (tanto abrir puertos como abrir aplicaciones):

Código:

unit UnidadMenuPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActiveX, ComObj, shellapi, ComCtrls;

type
  TformMenuPrincipal = class(TForm)
    LWEB: TLabel;
    dlAbrir: TOpenDialog;
    PageControl1: TPageControl;
    tabPuerto: TTabSheet;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    txtNombre: TEdit;
    txtNumero: TEdit;
    bAbrirPuerto: TButton;
    GroupBox3: TGroupBox;
    opTCP: TRadioButton;
    opUDP: TRadioButton;
    GroupBox5: TGroupBox;
    opPuertoAmbitoLocal: TRadioButton;
    opPuertoAmbitoInternet: TRadioButton;
    GroupBox4: TGroupBox;
    Label5: TLabel;
    bActivarRegla: TButton;
    txtActivarPuerto: TEdit;
    GroupBox7: TGroupBox;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    tabAplicacion: TTabSheet;
    GroupBox2: TGroupBox;
    Label3: TLabel;
    Label4: TLabel;
    txtAplicacionNombre: TEdit;
    txtAplicacionRuta: TEdit;
    bAbrirAplicacion: TButton;
    bSel: TButton;
    GroupBox6: TGroupBox;
    opAplicacionAmbitoLocal: TRadioButton;
    opAplicacionAmbitoInternet: TRadioButton;
    opActivar: TCheckBox;
    tabEstado: TTabSheet;
    GroupBox8: TGroupBox;
    btEstadoActivar: TButton;
    bEstadoDesactivar: TButton;
    procedure bAbrirPuertoClick(Sender: TObject);
    procedure LWEBClick(Sender: TObject);
    procedure bSelClick(Sender: TObject);
    procedure bAbrirAplicacionClick(Sender: TObject);
    procedure bActivarReglaClick(Sender: TObject);
    procedure btEstadoActivarClick(Sender: TObject);
    procedure bEstadoDesactivarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  formMenuPrincipal: TformMenuPrincipal;
  const
   NET_FW_PROFILE_DOMAIN = 0;
   NET_FW_PROFILE_STANDARD = 1;
   NET_FW_IP_VERSION_ANY = 2;
   NET_FW_IP_PROTOCOL_UDP = 17;
   NET_FW_IP_PROTOCOL_TCP = 6;
   NET_FW_SCOPE_ALL = 0;
   NET_FW_SCOPE_LOCAL_SUBNET = 1;


implementation

{$R *.dfm}

procedure abrirPuertoFirewall (nombreEntrada : string; numeroPuerto : Cardinal;
    protocoloTCP : boolean; ambitoLocal : boolean; activar : Boolean);
var
  fwMgr, objPuerto : OleVariant;
  perfil : OleVariant;
begin
  fwMgr := CreateOLEObject('HNetCfg.FwMgr');
  perfil := fwMgr.LocalPolicy.CurrentProfile;
  objPuerto := CreateOLEObject('HNetCfg.FWOpenPort');
  objPuerto.Name := nombreEntrada;
  if protocoloTCP then
    objPuerto.Protocol := NET_FW_IP_PROTOCOL_TCP
  else
    objPuerto.Protocol := NET_FW_IP_PROTOCOL_UDP;
  objPuerto.Port := numeroPuerto;
  if ambitoLocal then
    objPuerto.Scope := NET_FW_SCOPE_LOCAL_SUBNET
  else
    objPuerto.Scope := NET_FW_SCOPE_ALL;
  objPuerto.Enabled := true;
  perfil.GloballyOpenPorts.Add(objPuerto);
end;

procedure activarReglaFirewall (numeroPuerto : Cardinal;
    protocoloTCP : boolean; activar : Boolean);
var
  fwMgr, objPuerto : OleVariant;
  perfil : OleVariant;
begin
  fwMgr := CreateOLEObject('HNetCfg.FwMgr');
  perfil := fwMgr.LocalPolicy.CurrentProfile;
  objPuerto := CreateOLEObject('HNetCfg.FWOpenPort');
  if protocoloTCP then
    objPuerto.Protocol := NET_FW_IP_PROTOCOL_TCP
  else
    objPuerto.Protocol := NET_FW_IP_PROTOCOL_UDP;
  objPuerto.Port := numeroPuerto;
  objPuerto.Enabled := activar;
  perfil.GloballyOpenPorts.Add(objPuerto);
end;

procedure abrirAplicacionFirewall (nombreEntrada : string;
    rutaAplicacion : string; ambitoLocal : boolean; activar : Boolean);
var
  fwMgr, objAplicacion : OleVariant;
  perfil : OleVariant;
begin
  fwMgr := CreateOLEObject('HNetCfg.FwMgr');
  perfil := fwMgr.LocalPolicy.CurrentProfile;
  objAplicacion := CreateOLEObject('HNetCfg.FwAuthorizedApplication');
  objAplicacion.ProcessImageFileName := rutaAplicacion;
  objAplicacion.Name := nombreEntrada;
  if ambitoLocal then
    objAplicacion.Scope := NET_FW_SCOPE_LOCAL_SUBNET
  else
    objAplicacion.Scope := NET_FW_SCOPE_ALL;
  objAplicacion.IpVersion := NET_FW_IP_VERSION_ANY;
  objAplicacion.Enabled := activar;
  perfil.AuthorizedApplications.Add(objAplicacion);
end;

procedure activarDesactivarFirewall (activar : boolean);
var
  fwMgr : OleVariant;
  perfil : OleVariant;
begin
  fwMgr := CreateOLEObject('HNetCfg.FwMgr');
  perfil := fwMgr.LocalPolicy.CurrentProfile;
  perfil.FirewallEnabled := activar;
end;

procedure TformMenuPrincipal.bAbrirPuertoClick(Sender: TObject);
begin
  abrirPuertoFirewall (txtNombre.Text, strtoint(txtNumero.Text),
      opTCP.Checked, opPuertoAmbitoLocal.Checked, true);
  MessageDlg('Regla añadida al cortafuegos de Windows.',
      mtInformation, [mbok], 0);
end;

procedure TformMenuPrincipal.LWEBClick(Sender: TObject);
begin
  ShellExecute(Handle, Nil, PChar('www.ajpdsoft.com'),
      Nil, Nil, SW_SHOWNORMAL);
end;

procedure TformMenuPrincipal.bSelClick(Sender: TObject);
begin
  if dlAbrir.Execute then
    txtAplicacionRuta.Text := dlAbrir.FileName;
end;

procedure TformMenuPrincipal.bAbrirAplicacionClick(Sender: TObject);
begin
  abrirAplicacionFirewall(txtAplicacionNombre.Text,
      txtAplicacionRuta.Text, opAplicacionAmbitoLocal.Checked, true);
  MessageDlg('Aplicación añadida al cortafuegos de Windows.',
      mtInformation, [mbok], 0);
end;

procedure TformMenuPrincipal.bActivarReglaClick(Sender: TObject);
begin
  activarReglaFirewall (strtoint(txtActivarPuerto.Text),
      opTCP.Checked, opActivar.Checked);
  MessageDlg('Regla añadida al cortafuegos de Windows.',
      mtInformation, [mbok], 0);
end;

procedure TformMenuPrincipal.btEstadoActivarClick(Sender: TObject);
begin
  activarDesactivarFirewall(True);
  MessageDlg('Cortafuegos de Windows activado.',
      mtInformation, [mbok], 0);
end;

procedure TformMenuPrincipal.bEstadoDesactivarClick(Sender: TObject);
begin
  activarDesactivarFirewall(false);
  MessageDlg('Cortafuegos de Windows desactivado.',
      mtInformation, [mbok], 0);       
end;

end.
MensajePublicado:
Mar May 26, 2009 10:08 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Ver estado, cambiar estado cortafuegos (firewall) de Win Responder citando



Anuncios



Aquí tienes una descarga gratuita (freeware) del código fuente de la aplicación AjpdSoft Abrir Puertos Cortafuegos Windows:

http://www.ajpdsoft.com/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=237
MensajePublicado:
Dom May 31, 2009 11:48 am
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A