azure 如何在PowerShell输出中删除/添加特定对象

rjee0c15  于 2023-05-29  发布在  Shell
关注(0)|答案(2)|浏览(257)

我已经自动化了在Azure Application Gateway WAF上创建自定义规则的过程。但是,每当我更新任何现有的自定义规则时,它都会自动删除所有其他自定义规则。我无法在Azure PowerShell文档中找到用于更新单个自定义规则的特定命令。我也向微软提出了这个问题,他们已经确认该命令在Azure PowerShell中不可用。
在我的研究中,我发现我们可以通过使用“.Add”和“.Remove”操作来实现这一点。但是,我在尝试这样做时遇到了一些错误。
目前,我正在尝试两种方法:
1.向特定的现有自定义规则添加新的恶意IP。当我尝试执行此操作时,收到以下错误消息:

PS C:\Users\japuthiyakath> $policy = Get-AzApplicationGatewayFirewallPolicy -Name $policyName -ResourceGroupName $policyRG
PS C:\Users\japuthiyakath> (($policy.CustomRules | Where-Object {$_.Name -match "IPRestrict"}).MatchConditions.MatchValues).Add('2.3.6.9')
MethodInvocationException: Exception calling "Add" with "1" argument(s): "Collection was of a fixed size."

1.从防火墙策略中删除IPRestrict自定义规则,并用修改后的自定义规则替换它。使用.RemoveAt(0)的方法工作得很好,但我们可能会在确定要删除的对象的确切位置时遇到困难。
我尝试使用下面提供的命令删除该对象,但尽管没有任何错误,该对象仍然不受影响,也没有被删除。

PS C:\Users\japuthiyakath> ($policy.CustomRules | Where-Object {$_.Name -match "IPRestrict"}).Remove

供参考;

bvn4nwqk

bvn4nwqk1#

顺便说一句:下面使用Where-Object Name -eq IPRestrict而不是Where-Object {$_.Name -match "IPRestrict"}来标识感兴趣的策略:-eq确保了文字、全值匹配,而-match还查找 * 子字符串 *(通过regex模式)。另外,省略{ ... }$_simplified syntax的应用。
回复1:

  • 这并不明显,但您的命令应用member-access enumeration,因为.MatchConditions.MatchValues属性包含 listsSystem.Collections.Generic.List1`类型的类似数组的集合)。
  • 由于产生的成员访问枚举,.MatchConditions.MatchValues返回一个 * 常规.NET数组 *(System.Array),其中包含所有.MatchCondition列表条目中的.MatchValues列表条目。
  • .NET数组是 * 固定大小 * 的数据结构,并且仅在实现IList接口的上下文中实现.Add()方法。
  • 调用this - unsupported by arrays -方法会导致您看到的异常:“集合是固定大小的”。
  • 要成功地扩展存储在.MatchValues中的 list(它 * 确实 * 支持.Add()),您要么需要确定要针对哪个特定的.MatchConditions列表条目,要么必须迭代 * 所有 * .MatchConditions列表条目并在每个 * 上调用.Add() *(假设这是有意义的);例如:
# Target the *first* .MatchCondition list element
($policy.CustomRules | Where-Object Name -eq IPRestrict).MatchConditions[0].
  MatchValues.Add('2.3.6.9')

# Target *all* .MatchCondition list elements (don't know if that makes sense)
($policy.CustomRules | Where-Object Name -eq IPRestrict).MatchConditions |
  ForEach-Object { $_.MatchValues.Add('2.3.6.9') }

回复2:
[System.Collections.Generic.List1](https://learn.microsoft.com/en-US/dotnet/api/System.Collections.Generic.List-1)类型有一个.Remove()`方法,它允许你传递 object 从列表中删除,而不必知道它在列表中的 * 索引 *:

$ruleToRemove = $policy.CustomRules | Where-Object Name -eq IPRestrict
$policy.CustomRules.Remove($ruleToRemove)
w8rqjzmb

w8rqjzmb2#

分辨率:
要更新Web应用程序防火墙(WAF)的现有策略,请使用以下命令:

$NewIPRestrictRule = New-AzApplicationGatewayFirewallCustomRule -Name $customRuleName -Priority $customRulePriority -RuleType MatchRule -MatchCondition $condition -Action Block
$policy = Get-AzApplicationGatewayFirewallPolicy -Name $policyName -ResourceGroupName $policyRG
$ruleToRemove = $policy.CustomRules | Where-Object Name -eq $customRuleName
$policy.CustomRules.Remove($ruleToRemove)
$policy.CustomRules.Add($NewIPRestrictRule)
Set-AzApplicationGatewayFirewallPolicy -InputObject $policy

相关问题