如何在辅助角色实例上成功编辑代码中的防火墙规则?

How to edit Firewall rules in code successfully on a Worker Role Instance?

我正在尝试一些在本地运行但在我的云实例上不起作用的代码。我认为它可能与权限相关,但我无法修复它。这是我在本地调试我的工作者角色时所拥有的,但在发布时没有任何反应(现在正在暂存)。

string strCmdText = string.Format("advfirewall firewall add rule name=\"BlockU\" protocol=any dir=in action=block remoteip={0}", ip);

ProcessStartInfo psi = new ProcessStartInfo("netsh.exe", strCmdText);
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
try
{
    Process.Start(psi);
}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message);
}

我也试过使用

psi.Verb = "runas"; 

但这也无济于事。

最后我像这样尝试了防火墙 api。这在本地也有效,但在最后一行抛出拒绝访问错误。

INetFwRule2 inboundRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
 inboundRule.Enabled = true;
 inboundRule.RemoteAddresses = ip;
 inboundRule.InterfaceTypes = "All";
 inboundRule.Protocol = (int)NetFwTypeLib.NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY;
 inboundRule.Name = "BlockU Part 2";
 //inboundRule.Profiles = currentProfiles;
 inboundRule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
 // Now add the rule

 INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
 firewallPolicy.Rules.Add(inboundRule);

我在 azure forums 上发现我需要以更高的权限启用我的工作者角色 运行。这可以在 ServiceDefinition.csdef 文件中完成,方法是将以下属性添加到 WorkerRole 元素

<WorkerRole name="CloudService.Worker" vmsize="ExtraSmall"
            enableNativeCodeExecution="true">

并添加

<Runtime executionContext="elevated" />

WorkerRole 元素内的元素。

两组代码 运行 成功更改了配置。

我在 msdn 博客中发现了一个有趣的 post,它使用了一个简化防火墙规则配置的库,它可能会解决您的问题,

http://blogs.msdn.com/b/securitytools/archive/2009/08/21/automating-windows-firewall-settings-with-c.aspx