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;