我正在尝试通过防火墙允许我的应用程序,因为我必须在主动和被动模式下执行ftp不是一个选项,因为没有为此配置服务器。所以我尝试了以下编译好的代码,我使用以下代码执行:
MyApp.Classes.INetFwMgr mgr = new MyApp.Classes.INetFwMgr();
mgr.AuthorizeApplication(Application.ProductName, Application.StartupPath,
NET_FW_SCOPE_.NET_FW_SCOPE_ALL,
NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY);
完成工作的班级:
private const string CLSID_FIREWALL_MANAGER =
"{304CE942-6E39-40D8-943A-B913C40C9CD4}";
private static NetFwTypeLib.INetFwMgr GetFirewallManager()
{
Type objectType = Type.GetTypeFromCLSID(
new Guid(CLSID_FIREWALL_MANAGER));
return Activator.CreateInstance(objectType)
as NetFwTypeLib.INetFwMgr;
}
private const string PROGID_AUTHORIZED_APPLICATION =
"HNetCfg.FwAuthorizedApplication";
public bool AuthorizeApplication(string title, string applicationPath,
NET_FW_SCOPE_ scope, NET_FW_IP_VERSION_ ipVersion)
{
// Create the type from prog id
Type type = Type.GetTypeFromProgID(PROGID_AUTHORIZED_APPLICATION);
INetFwAuthorizedApplication auth = Activator.CreateInstance(type)
as INetFwAuthorizedApplication;
auth.Name = title;
auth.ProcessImageFileName = applicationPath; //Getting Access Denied Exception Here
auth.Scope = scope;
auth.IpVersion = ipVersion;
auth.Enabled = true;
NetFwTypeLib.INetFwMgr manager = GetFirewallManager();
try
{
manager.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(auth);
}
catch (Exception ex)
{
return false;
}
return true;
}
使用上面的代码,但我在行
上得到Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
c#exception
auth.ProcessImageFileName = applicationPath;
任何想法该怎么做?
Edit1:
如何使用代码以管理员身份运行此操作?
Edit2:
我也试过Putting <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> in manifest did not make a difference
P.S.This程序执行上下文可以是Win 7,vista,xp
答案 0 :(得分:1)
防火墙管理是系统级安全功能,必须在用户模式应用程序代码之外完成。配置必须由管理员完成。
编写您编写的代码并假设您的应用程序将以管理员身份运行是不好的做法。即使它是由管理员运行,你现在有一个应用程序“做FTP东西”和“做防火墙的东西”。没有任何应用程序像这样写过。
您可以编写与系统防火墙交互的代码,并且必须使用提升的权限运行该代码。通常不会创建这样的“帮助应用程序”,因为Windows(以及其他所有操作系统)都具有操作系统附带的所有必要的管理工具(即wf.msc
)。
答案 1 :(得分:1)
我观察到如果我将ftp下载语句的顺序更改为以下窗口对话框,则会显示do you want to allow this program access through firewall
;如果我点击允许访问代码工作完美。
requestDownload = (FtpWebRequest)WebRequest.Create(uri);
requestDownload.UsePassive = false;
requestDownload.KeepAlive = false;
requestDownload.UseBinary = true;
requestDownload.Method = WebRequestMethods.Ftp.DownloadFile;
requestDownload.Credentials = new NetworkCredential(ftpInfoDownload[3], ftpInfoDownload[4]);
responseDownload = (FtpWebResponse)requestDownload.GetResponse();
Stream ftpStream = responseDownload.GetResponseStream();
答案 2 :(得分:0)
尝试打开防火墙中的FTP端口 - 端口20和21 - 并查看是否能解决您的问题。
答案 3 :(得分:0)
以不同用户身份运行: Run Code as a different user (C#)
至于通过防火墙,您是否与负责防火墙安全的人/小组进行了交谈?他们可能有一些你可以使用的规则。