I have this following module using for adding and enabling/disabling Windows Firewall rules using Python.
I currently use subprocess.call
to execute the netsh
command inside Python. I'm wondering if there is any better method to do this? Executing the cmd
command inside Python seems to be impractical to me.
import subprocess, ctypes, os, sys
from subprocess import Popen, DEVNULL
def chkAdmin():
""" Force to start application with admin rights """
try:
isAdmin = ctypes.windll.shell32.IsUserAnAdmin()
except AttributeError:
isAdmin = False
if not isAdmin:
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
def addRule(rule_name, file_path):
""" Add rule to Windows Firewall """
subprocess.call("netsh advfirewall firewall add rule name="+ rule_name +" dir=out action=block enable=no program=" + file_path, shell=True, stdout=DEVNULL, stderr=DEVNULL)
print("Rule", rule_name, "for", file_path, "added")
def modifyRule(rule_name, state):
""" Enable/Disable specific rule, 0 = Disable / 1 = Enable """
if state:
subprocess.call("netsh advfirewall firewall set rule name="+ rule_name +" new enable=yes", shell=True, stdout=DEVNULL, stderr=DEVNULL)
print("Rule", rule_name, "Enabled")
else:
subprocess.call("netsh advfirewall firewall set rule name="+ rule_name +" new enable=no", shell=True, stdout=DEVNULL, stderr=DEVNULL)
print("Rule", rule_name, "Disabled")
chkAdmin()
addRule("RULE_NAME", "PATH_TO_FILE")
modifyRule("RULE_NAME", 1)