Ver Mensaje Individual
  #4  
Antiguo 18-07-2024
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 321
Reputación: 4
pgranados Va por buen camino
Gracias por sus aportes, al final utilice el procedimiento de Casimiro y con ayuda de GPT lo modifique un poco para que la regla se cree solo cuando no exista.

Código Delphi [-]

procedure AgregarFirewallFirebird;
var
  Command, CheckCommand: string;
  OutputLines: TStringList;
  ShellOutput: string;
  SecurityAttributes: TSecurityAttributes;
  StdOutRead, StdOutWrite: THandle;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  BytesRead: DWORD;
  Buffer: array[0..255] of AnsiChar;
  i:integer;
begin
  CheckCommand := 'netsh advfirewall firewall show rule name="REGLA 3050"';
  Command := 'netsh advfirewall firewall add rule name="REGLA 3050" dir=in action=allow protocol=TCP localport=3050';
  OutputLines := TStringList.Create;

  try
    ZeroMemory(@SecurityAttributes, SizeOf(SecurityAttributes));
    SecurityAttributes.nLength := SizeOf(SecurityAttributes);
    SecurityAttributes.bInheritHandle := TRUE;

    if not CreatePipe(StdOutRead, StdOutWrite, @SecurityAttributes, 0) then
      RaiseLastOSError;

    try
      ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
      StartupInfo.cb := SizeOf(StartupInfo);
      StartupInfo.hStdOutput := StdOutWrite;
      StartupInfo.hStdError := StdOutWrite;
      StartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := SW_HIDE;

      ZeroMemory(@ProcessInfo, SizeOf(ProcessInfo));

      if CreateProcess(nil, PChar('cmd.exe /C ' + CheckCommand), nil, nil, TRUE, CREATE_NO_WINDOW, nil, nil, StartupInfo, ProcessInfo) then
      begin
        CloseHandle(StdOutWrite);

        repeat
          BytesRead := 0;
          ReadFile(StdOutRead, Buffer, SizeOf(Buffer) - 1, BytesRead, nil);
          Buffer[BytesRead] := #0;
          ShellOutput := ShellOutput + String(Buffer);
        until BytesRead = 0;

        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);
      end;

      OutputLines.Text := ShellOutput;

      i:= Pos('REGLA 3050', OutputLines.Text);
      if i = 0 then
        ShellExecute(0, 'open', 'cmd.exe', PChar('/C ' + Command), nil, SW_HIDE);

    finally
      CloseHandle(StdOutRead);
    end;

  finally
    OutputLines.Free;
  end;
end;
Responder Con Cita