我可以使用Chef和Powershell创建自定义Windows防火墙规则。我遇到了not_if。
的问题我从这里使用了注册表键方法: http://docs.opscode.com/resource_registry_key.html
自定义防火墙规则使用随机GUID创建注册表项。我无法使用这些方法因为我不知道密钥名称。键值在每个节点上都是相同的,但不是键名。
以下作品。但是自定义键具有键名称的GUID
execute "enableMSDTCFirewall" do
command "netsh advfirewall firewall set rule group=\"Distributed Transaction Coordinator\" new enable=yes"
action :run
not_if { registry_data_exists?("HKLM\\SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\FirewallRules", {:name => 'MSDTC-In-TCP', :type => :string, :data => "v2.20|Action=Allow|Active=TRUE|Dir=In|Protocol=6|App=%SystemRoot%\\system32\\msdtc.exe|Name=@FirewallAPI.dll,-33503|Desc=@FirewallAPI.dll,-33506|EmbedCtxt=@FirewallAPI.dll,-33502|"})}
end
除了标志之外,我无法找出另一种方法来检查规则是否存在,并且在每次客户端运行期间都没有执行脚本。有任何想法吗?
结束这项工作
execute "enableFirewallRuleNameOutbound" do
command "powershell.exe New-NetFirewallRule -DisplayName \"RuleName\" -Direction Outbound -LocalPort 20000 -Protocol TCP -Action Allow"
action :run
not_if 'netsh advfirewall firewall show rule name=\"RuleName\" > nul'
端
答案 0 :(得分:4)
我猜这个规则有一个你没有使用的名称,或者可以用来帮助。以下内容应该有效。
添加规则时,请为其命名:
netsh advfirewall firewall add rule name=enableMSDTCFirewall ...
检查not_if中的规则:
not_if 'netsh advfirewall firewall show rule name=enableMSDTCFirewall > nul'
如果规则已存在,show
命令应返回ERRORLEVEL
0。