WPF应用程序未请求防火墙许可

6
我正在制作一个 WPF 应用程序,使用 WebCLient 从 Web 服务器下载文件。在 Debug 模式下启动应用程序时,它会请求防火墙权限,然后我允许它,这样我的应用程序就可以正常工作。
但在发布模式下,它不会提示我防火墙权限,这使得我的应用程序在下载文件时崩溃。我已经使用发布模式部署了我的应用程序。当我运行部署后得到的 .exe 文件时,它仍然不会提示防火墙权限,使得我的应用程序无法正确工作。
有办法在发布模式下触发防火墙提示吗?也许可以通过编程实现?

这可能与此相关:http://superuser.com/questions/115667/how-do-i-get-the-windows-7-firewall-to-prompt-me-whether-to-allow-or-deny-a-new - PaulF
我想知道为什么你会收到防火墙提示——WebClient使用的是默认不被阻止的出站连接,所以我怀疑你的应用程序由于其他原因而崩溃,请问错误是什么? - markmnl
1个回答

0

必读:我已经搜索了使用C#请求防火墙访问的方法,但没有找到任何相关或安全的信息。该批处理文件是100%干净的,不会被检测为任何类型的恶意软件。(我无法找到在C#中执行此操作的方法,这不是离题!)

我不太清楚如何请求添加允许规则,但我知道如何添加规则:
仅限入站:

1)启动记事本并键入:

@echo off
setlocal
set RULENAME="SomethingSpecial"
netsh advfirewall firewall show rule name=%RULENAME% >nul
if not ERRORLEVEL 1 ( goto :EOF) else (
netsh advfirewall firewall add rule name="SomethingSpecial" dir=in action=allow program="DIRECTORY" enable=yes) 
goto :EOF 

2) 将SomethingSpecial替换为你想要的任何内容。 它只是一个名称,如果你替换它,请在所有地方进行替换(可以保留SomethingSpecial不变)

3) 将DIRECTORY替换为您的发布构建目录(例如:C:\program files\something.exe) dir表示设置为in方向,因为您正在下载。 对于双向,请键入:

 @echo off
setlocal
set RULENAME="SomethingSpecial"
netsh advfirewall firewall show rule name=%RULENAME% >nul
if not ERRORLEVEL 1 ( goto :EOF) else (
netsh advfirewall firewall add rule name="SomethingSpecial" dir=in action=allow program="DIRECTORY" enable=yes
netsh advfirewall firewall add rule name="SomethingSpecial" dir=out action=allow program="DIRECTORY" enable=yes) 
goto :EOF

保存为.bat格式并记住路径

现在是有趣的部分...

在您的应用程序中使用以下代码.. 如果您的程序不以管理员身份运行,并且您不希望用户不断授予权限,请找到一种方法仅运行该进程一次...也许保存到文件、布尔值或字符串,并在程序启动时检查它,以便程序不会每次都运行.bat进程。

 ProcessStartInfo bat = new ProcessStartInfo();
    bat.Verb = "runas";
    bat.FileName = "BatchDirectory";
    bat.WindowStyle = ProcessWindowStyle.Hidden;
    Process.Start(bat);

将BatchDirectory替换为您的批处理目录(仅在此处使用“/”而不是“\”)

玩得开心!如果您有问题或遇到问题,请留言评论。


我也在这个问题上苦苦挣扎。我不明白你的解决方案是如何解决这个问题的。我手动添加了一条规则,但它并没有解决问题。 - Travis Tubbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接