Add and enable/disable Windows Firewall rules with Python
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)
python python-3.x networking windows
add a comment |
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)
python python-3.x networking windows
1
could it be this : stackoverflow.com/a/5486837/6212957
– Feelsbadman
23 hours ago
1
I would at least give PowerShell a look. It supports remote execution and is as close as you can get to a tool intended to manage Windows via script.
– jpmc26
19 hours ago
Is it possible for these commands to fail? If netsh returns an error for any reason, it will go undetected (correct me if I'm wrong). At least assert things went smoothly even if you don't want to handle errors.
– sudo rm -rf slash
12 hours ago
add a comment |
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)
python python-3.x networking windows
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)
python python-3.x networking windows
python python-3.x networking windows
edited 11 hours ago
200_success
128k15152414
128k15152414
asked 23 hours ago
phwtphwt
806
806
1
could it be this : stackoverflow.com/a/5486837/6212957
– Feelsbadman
23 hours ago
1
I would at least give PowerShell a look. It supports remote execution and is as close as you can get to a tool intended to manage Windows via script.
– jpmc26
19 hours ago
Is it possible for these commands to fail? If netsh returns an error for any reason, it will go undetected (correct me if I'm wrong). At least assert things went smoothly even if you don't want to handle errors.
– sudo rm -rf slash
12 hours ago
add a comment |
1
could it be this : stackoverflow.com/a/5486837/6212957
– Feelsbadman
23 hours ago
1
I would at least give PowerShell a look. It supports remote execution and is as close as you can get to a tool intended to manage Windows via script.
– jpmc26
19 hours ago
Is it possible for these commands to fail? If netsh returns an error for any reason, it will go undetected (correct me if I'm wrong). At least assert things went smoothly even if you don't want to handle errors.
– sudo rm -rf slash
12 hours ago
1
1
could it be this : stackoverflow.com/a/5486837/6212957
– Feelsbadman
23 hours ago
could it be this : stackoverflow.com/a/5486837/6212957
– Feelsbadman
23 hours ago
1
1
I would at least give PowerShell a look. It supports remote execution and is as close as you can get to a tool intended to manage Windows via script.
– jpmc26
19 hours ago
I would at least give PowerShell a look. It supports remote execution and is as close as you can get to a tool intended to manage Windows via script.
– jpmc26
19 hours ago
Is it possible for these commands to fail? If netsh returns an error for any reason, it will go undetected (correct me if I'm wrong). At least assert things went smoothly even if you don't want to handle errors.
– sudo rm -rf slash
12 hours ago
Is it possible for these commands to fail? If netsh returns an error for any reason, it will go undetected (correct me if I'm wrong). At least assert things went smoothly even if you don't want to handle errors.
– sudo rm -rf slash
12 hours ago
add a comment |
2 Answers
2
active
oldest
votes
This seems OK
We can add a little flavor to it:
Don't use string concatenation, but use
f"{strings}"
or"{}".format(strings)
Your modify rule, can be simplified
The
if
else
don't differ that much, you can use a (Python)ternary to calculate the variables beforehand
Consider to chop up the lines, to make it a little more readable
Functions and variables should be
snake_case
according to PEP8Use a
if __name__ == '__main__'
guard
As mentioned, you could use
os.system("command")
instead ofsubprocess
But honestly I would stick with
subprocess
, since it will give greater control over how commands are executed
Code
import subprocess, ctypes, os, sys
from subprocess import Popen, DEVNULL
def check_admin():
""" 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 add_rule(rule_name, file_path):
""" Add rule to Windows Firewall """
subprocess.call(
f"netsh advfirewall firewall add rule name={rule_name} dir=out action=block enable=no program={file_path}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} for {file_path} added")
def modify_rule(rule_name, state):
""" Enable/Disable specific rule, 0 = Disable / 1 = Enable """
state, message = ("yes", "Enabled") if state else ("no", "Disabled")
subprocess.call(
f"netsh advfirewall firewall set rule name={rule_name} new enable={state}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} {message}")
if __name__ == '__main__':
check_admin()
add_rule("RULE_NAME", "PATH_TO_FILE")
modify_rule("RULE_NAME", 1)
Thanks! and may I ask another question? Why you recommend against using string concatenation?
– phwt
21 hours ago
3
Sure,.. it has no significant influence, but it does read a lot smoother, especially with the introduction off"{strings}"
. (Python 3.6+)
– Ludisposed
21 hours ago
add a comment |
I agree with @Ludisposed answer, but you have a few subprocess
gotchas:
- You don't need to spawn a shell in order to run the command, simply build your command as a list of arguments and it will be fine. This is especially important if your rules names may contains spaces as the command would be treated entirelly differently in your implementation;
Replace the oldsubprocess.call
bysubprocess.run
;- You may be interested to run
subprocess.run
by specifyingcheck=True
in order to generate an exception and be alerted if something does not go according to plan.
Applying these changes to e.g. modify_rule
can lead to:
def modify_rule(rule_name, enabled=True):
"""Enable or Disable a specific rule"""
subprocess.run(
[
'netsh', 'advfirewall', 'firewall',
'set', 'rule', f'name={rule_name}',
'new', f'enable={"yes" if enabled else "no"}',
],
check=True,
stdout=DEVNULL,
stderr=DEVNULL
)
Also note that I removed the print
call from the function as it impairs reusability. If the caller want this kind of messages, it should be responsible for printing them, not this function.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f211163%2fadd-and-enable-disable-windows-firewall-rules-with-python%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
This seems OK
We can add a little flavor to it:
Don't use string concatenation, but use
f"{strings}"
or"{}".format(strings)
Your modify rule, can be simplified
The
if
else
don't differ that much, you can use a (Python)ternary to calculate the variables beforehand
Consider to chop up the lines, to make it a little more readable
Functions and variables should be
snake_case
according to PEP8Use a
if __name__ == '__main__'
guard
As mentioned, you could use
os.system("command")
instead ofsubprocess
But honestly I would stick with
subprocess
, since it will give greater control over how commands are executed
Code
import subprocess, ctypes, os, sys
from subprocess import Popen, DEVNULL
def check_admin():
""" 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 add_rule(rule_name, file_path):
""" Add rule to Windows Firewall """
subprocess.call(
f"netsh advfirewall firewall add rule name={rule_name} dir=out action=block enable=no program={file_path}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} for {file_path} added")
def modify_rule(rule_name, state):
""" Enable/Disable specific rule, 0 = Disable / 1 = Enable """
state, message = ("yes", "Enabled") if state else ("no", "Disabled")
subprocess.call(
f"netsh advfirewall firewall set rule name={rule_name} new enable={state}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} {message}")
if __name__ == '__main__':
check_admin()
add_rule("RULE_NAME", "PATH_TO_FILE")
modify_rule("RULE_NAME", 1)
Thanks! and may I ask another question? Why you recommend against using string concatenation?
– phwt
21 hours ago
3
Sure,.. it has no significant influence, but it does read a lot smoother, especially with the introduction off"{strings}"
. (Python 3.6+)
– Ludisposed
21 hours ago
add a comment |
This seems OK
We can add a little flavor to it:
Don't use string concatenation, but use
f"{strings}"
or"{}".format(strings)
Your modify rule, can be simplified
The
if
else
don't differ that much, you can use a (Python)ternary to calculate the variables beforehand
Consider to chop up the lines, to make it a little more readable
Functions and variables should be
snake_case
according to PEP8Use a
if __name__ == '__main__'
guard
As mentioned, you could use
os.system("command")
instead ofsubprocess
But honestly I would stick with
subprocess
, since it will give greater control over how commands are executed
Code
import subprocess, ctypes, os, sys
from subprocess import Popen, DEVNULL
def check_admin():
""" 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 add_rule(rule_name, file_path):
""" Add rule to Windows Firewall """
subprocess.call(
f"netsh advfirewall firewall add rule name={rule_name} dir=out action=block enable=no program={file_path}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} for {file_path} added")
def modify_rule(rule_name, state):
""" Enable/Disable specific rule, 0 = Disable / 1 = Enable """
state, message = ("yes", "Enabled") if state else ("no", "Disabled")
subprocess.call(
f"netsh advfirewall firewall set rule name={rule_name} new enable={state}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} {message}")
if __name__ == '__main__':
check_admin()
add_rule("RULE_NAME", "PATH_TO_FILE")
modify_rule("RULE_NAME", 1)
Thanks! and may I ask another question? Why you recommend against using string concatenation?
– phwt
21 hours ago
3
Sure,.. it has no significant influence, but it does read a lot smoother, especially with the introduction off"{strings}"
. (Python 3.6+)
– Ludisposed
21 hours ago
add a comment |
This seems OK
We can add a little flavor to it:
Don't use string concatenation, but use
f"{strings}"
or"{}".format(strings)
Your modify rule, can be simplified
The
if
else
don't differ that much, you can use a (Python)ternary to calculate the variables beforehand
Consider to chop up the lines, to make it a little more readable
Functions and variables should be
snake_case
according to PEP8Use a
if __name__ == '__main__'
guard
As mentioned, you could use
os.system("command")
instead ofsubprocess
But honestly I would stick with
subprocess
, since it will give greater control over how commands are executed
Code
import subprocess, ctypes, os, sys
from subprocess import Popen, DEVNULL
def check_admin():
""" 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 add_rule(rule_name, file_path):
""" Add rule to Windows Firewall """
subprocess.call(
f"netsh advfirewall firewall add rule name={rule_name} dir=out action=block enable=no program={file_path}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} for {file_path} added")
def modify_rule(rule_name, state):
""" Enable/Disable specific rule, 0 = Disable / 1 = Enable """
state, message = ("yes", "Enabled") if state else ("no", "Disabled")
subprocess.call(
f"netsh advfirewall firewall set rule name={rule_name} new enable={state}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} {message}")
if __name__ == '__main__':
check_admin()
add_rule("RULE_NAME", "PATH_TO_FILE")
modify_rule("RULE_NAME", 1)
This seems OK
We can add a little flavor to it:
Don't use string concatenation, but use
f"{strings}"
or"{}".format(strings)
Your modify rule, can be simplified
The
if
else
don't differ that much, you can use a (Python)ternary to calculate the variables beforehand
Consider to chop up the lines, to make it a little more readable
Functions and variables should be
snake_case
according to PEP8Use a
if __name__ == '__main__'
guard
As mentioned, you could use
os.system("command")
instead ofsubprocess
But honestly I would stick with
subprocess
, since it will give greater control over how commands are executed
Code
import subprocess, ctypes, os, sys
from subprocess import Popen, DEVNULL
def check_admin():
""" 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 add_rule(rule_name, file_path):
""" Add rule to Windows Firewall """
subprocess.call(
f"netsh advfirewall firewall add rule name={rule_name} dir=out action=block enable=no program={file_path}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} for {file_path} added")
def modify_rule(rule_name, state):
""" Enable/Disable specific rule, 0 = Disable / 1 = Enable """
state, message = ("yes", "Enabled") if state else ("no", "Disabled")
subprocess.call(
f"netsh advfirewall firewall set rule name={rule_name} new enable={state}",
shell=True,
stdout=DEVNULL,
stderr=DEVNULL
)
print(f"Rule {rule_name} {message}")
if __name__ == '__main__':
check_admin()
add_rule("RULE_NAME", "PATH_TO_FILE")
modify_rule("RULE_NAME", 1)
answered 22 hours ago
LudisposedLudisposed
7,16721959
7,16721959
Thanks! and may I ask another question? Why you recommend against using string concatenation?
– phwt
21 hours ago
3
Sure,.. it has no significant influence, but it does read a lot smoother, especially with the introduction off"{strings}"
. (Python 3.6+)
– Ludisposed
21 hours ago
add a comment |
Thanks! and may I ask another question? Why you recommend against using string concatenation?
– phwt
21 hours ago
3
Sure,.. it has no significant influence, but it does read a lot smoother, especially with the introduction off"{strings}"
. (Python 3.6+)
– Ludisposed
21 hours ago
Thanks! and may I ask another question? Why you recommend against using string concatenation?
– phwt
21 hours ago
Thanks! and may I ask another question? Why you recommend against using string concatenation?
– phwt
21 hours ago
3
3
Sure,.. it has no significant influence, but it does read a lot smoother, especially with the introduction of
f"{strings}"
. (Python 3.6+)– Ludisposed
21 hours ago
Sure,.. it has no significant influence, but it does read a lot smoother, especially with the introduction of
f"{strings}"
. (Python 3.6+)– Ludisposed
21 hours ago
add a comment |
I agree with @Ludisposed answer, but you have a few subprocess
gotchas:
- You don't need to spawn a shell in order to run the command, simply build your command as a list of arguments and it will be fine. This is especially important if your rules names may contains spaces as the command would be treated entirelly differently in your implementation;
Replace the oldsubprocess.call
bysubprocess.run
;- You may be interested to run
subprocess.run
by specifyingcheck=True
in order to generate an exception and be alerted if something does not go according to plan.
Applying these changes to e.g. modify_rule
can lead to:
def modify_rule(rule_name, enabled=True):
"""Enable or Disable a specific rule"""
subprocess.run(
[
'netsh', 'advfirewall', 'firewall',
'set', 'rule', f'name={rule_name}',
'new', f'enable={"yes" if enabled else "no"}',
],
check=True,
stdout=DEVNULL,
stderr=DEVNULL
)
Also note that I removed the print
call from the function as it impairs reusability. If the caller want this kind of messages, it should be responsible for printing them, not this function.
add a comment |
I agree with @Ludisposed answer, but you have a few subprocess
gotchas:
- You don't need to spawn a shell in order to run the command, simply build your command as a list of arguments and it will be fine. This is especially important if your rules names may contains spaces as the command would be treated entirelly differently in your implementation;
Replace the oldsubprocess.call
bysubprocess.run
;- You may be interested to run
subprocess.run
by specifyingcheck=True
in order to generate an exception and be alerted if something does not go according to plan.
Applying these changes to e.g. modify_rule
can lead to:
def modify_rule(rule_name, enabled=True):
"""Enable or Disable a specific rule"""
subprocess.run(
[
'netsh', 'advfirewall', 'firewall',
'set', 'rule', f'name={rule_name}',
'new', f'enable={"yes" if enabled else "no"}',
],
check=True,
stdout=DEVNULL,
stderr=DEVNULL
)
Also note that I removed the print
call from the function as it impairs reusability. If the caller want this kind of messages, it should be responsible for printing them, not this function.
add a comment |
I agree with @Ludisposed answer, but you have a few subprocess
gotchas:
- You don't need to spawn a shell in order to run the command, simply build your command as a list of arguments and it will be fine. This is especially important if your rules names may contains spaces as the command would be treated entirelly differently in your implementation;
Replace the oldsubprocess.call
bysubprocess.run
;- You may be interested to run
subprocess.run
by specifyingcheck=True
in order to generate an exception and be alerted if something does not go according to plan.
Applying these changes to e.g. modify_rule
can lead to:
def modify_rule(rule_name, enabled=True):
"""Enable or Disable a specific rule"""
subprocess.run(
[
'netsh', 'advfirewall', 'firewall',
'set', 'rule', f'name={rule_name}',
'new', f'enable={"yes" if enabled else "no"}',
],
check=True,
stdout=DEVNULL,
stderr=DEVNULL
)
Also note that I removed the print
call from the function as it impairs reusability. If the caller want this kind of messages, it should be responsible for printing them, not this function.
I agree with @Ludisposed answer, but you have a few subprocess
gotchas:
- You don't need to spawn a shell in order to run the command, simply build your command as a list of arguments and it will be fine. This is especially important if your rules names may contains spaces as the command would be treated entirelly differently in your implementation;
Replace the oldsubprocess.call
bysubprocess.run
;- You may be interested to run
subprocess.run
by specifyingcheck=True
in order to generate an exception and be alerted if something does not go according to plan.
Applying these changes to e.g. modify_rule
can lead to:
def modify_rule(rule_name, enabled=True):
"""Enable or Disable a specific rule"""
subprocess.run(
[
'netsh', 'advfirewall', 'firewall',
'set', 'rule', f'name={rule_name}',
'new', f'enable={"yes" if enabled else "no"}',
],
check=True,
stdout=DEVNULL,
stderr=DEVNULL
)
Also note that I removed the print
call from the function as it impairs reusability. If the caller want this kind of messages, it should be responsible for printing them, not this function.
answered 20 hours ago
Mathias EttingerMathias Ettinger
23.8k33182
23.8k33182
add a comment |
add a comment |
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f211163%2fadd-and-enable-disable-windows-firewall-rules-with-python%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
could it be this : stackoverflow.com/a/5486837/6212957
– Feelsbadman
23 hours ago
1
I would at least give PowerShell a look. It supports remote execution and is as close as you can get to a tool intended to manage Windows via script.
– jpmc26
19 hours ago
Is it possible for these commands to fail? If netsh returns an error for any reason, it will go undetected (correct me if I'm wrong). At least assert things went smoothly even if you don't want to handle errors.
– sudo rm -rf slash
12 hours ago