0

我正在处理我们的applicationHost.config文件中的大量重定向,基本上我想读取重定向规则并提取规则的 XML 信息,以便获取重定向 URL 以供审查。由于我们的 IIS 7.5 实例中有大量重定向规则,因此请使用 IIS 的 URLRewrite 功能。

我想导出我们现有规则的列表,并且由于 applicationHost.config 是使用 PowerShell 2.0 的 XML(我现在还不能使用 3.0),所以我应该能够遍历节点并拉取它们出去。很简单,直到我尝试在 sectionGroup system.webServer 下获取任何内容,当我尝试拉出该节点时,我无法获得任何值。

查看配置文件时,基本规则是结构化的(根据上面指向 Microsoft 的链接):

<rule name="Administration Redirection" enabled="true" stopProcessing="true">
      <match url="^administration[/]?.*" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
      <action type="Redirect" url="http://www.mysite.fake/{R:0}" />
</rule>

基本上我打算做以下事情:

[xml]$redirectXML = Get-Content $redirectFile
$redirectXML | % {$_.configuration.system.webServer.rewrite.rewriteMaps}

我想在哪里获取 rewriteMap 键和值,所以我有这些重定向,并且可以从如下规则中提取键和重定向的 URL:

$redirectXML | % {$_.configuration.system.webServer.rewrite.globalRules.rule}

在这里,我想链接中的值,这将使我获得大部分重定向 URL。

看起来 system.webServer 以某种方式弄乱了节点,因为它具有 . 在名字里。一个似乎可用的选项是使用 configuration.configSections,因为它显示了 sectionGroups,其中之一是 system.webServer,但我还没有弄清楚如何以正确的格式获取节点以提取我想要的部分。

有没有办法做到这一点,或者比尝试使用 Get-Content 更好的方法?我之前已经在其中完成了其他 XML 文件,虽然我看到了 applicationHost.config 的其他一些 PowerShell 脚本,大多数都是用于添加的,但我想做的只是提取几个节点。

感谢您的任何帮助或指点。

编辑:所以当我仍然环顾四周时,我发现我可以通过在它周围使用“标记来通过 system.webServer。像这样:

$redirectXMl.configuration."system.webServer".rewrite.rewriteMaps.rewriteMap.add

这让我得到了一个很好的键值对表中的重写映射。现在我仍然需要获取 GlobalRules。我可以通过以下方式获得每条规则:

$redirectXMl.configuration."system.webServer".rewrite.globalRules.rule

显示:

name           : Campaign Redirect
enabled        : true
stopProcessing : true
match          : match
conditions     : conditions
action         : action

但是我需要提取匹配和操作的值,但还没有。

4

1 回答 1

1

在通过 XMl 进行了一些工作后,并找到了一些其他答案,这些答案为我指明了正确的方向,我最终得到了以下脚本。它可能更干净,但基本上我希望提取处理重写/重定向的 applicationHost.config 部分,以便我可以管理我们在网站上处理的 100 个左右。很难在不同的文档上跟踪它们,所以我希望能够随时提取我想要的内容。

这是在 PowerShell v2.0 中,这是我们用于脚本的。评论主要是为了让我了解我在做什么。

# Get the path and name of the redirect file, the
# ApplicationHost.Config file
Param([string]$redirectFile)

# Constants that will be necessary
[string]$redirListDir = $null
# Using a CSV to make it simpler to reorder
[string]$redirectList = "redirectList.csv"

# Check that we have a file to pull redirects from
if ( ($redirectFile -eq $null) -or ($redirectFile -eq "")) {
  "Hey, you need to give a file to check.  Make sure its the path including the name "
  "of the applicationHost.config that needs to be checked.  Try something like "
  ".\redirectReview.ps1 C:\FileLocation\applicationHost.config"
  "Thank you!"
  exit
}

# Check that we have a place to put the file at the end
    if(($redirListDir -eq $null) -or ($redirListDir -eq "")) {
        if (Test-Path -Path "d:\temp") {
            $redirListDir = "d:\temp"
      "Using D:\Temp"
        } elseif (Test-Path -Path "c:\temp") {
            $redirListDir = "c:\temp"
      "Using C:\Temp"
        } else {
            "Cannot find a Temp directory as D:\temp or C:\temp.  Create one and try again.`n"
            exit
        }
  }

# Clean up any existing file so we can create a new one
$redirectListFile = Join-Path -Path $redirListDir  -ChildPath($redirectList)
if (Test-Path $redirectListFile) {
  Remove-Item $redirectListFile -Force
}

# Open the file and put it in an XML format
[xml]$redirectXML = Get-Content $redirectFile

# Review the XML tags

# This gets all the rewrite Map redirects
$rules = $redirectXMl.configuration."system.webServer".rewrite.rewriteMaps.rewriteMap.add 

"Now for the Global Rules"
# This gets all the rules that have been added
$redirectUrl = $redirectXMl.configuration."system.webServer".rewrite.globalRules.rule

"Creating the output file"
# Output the claimed values into a CSV file that can be reviewed somewhere
$rules | % {
  $a = $_.key + "`t" + $_.value
  $a >> $redirectListFile
}
$redirectUrl | % {
  $b1 = ($_.match).OuterXML
  $b2 = ($_.action).OuterXML
  # Probably a better way to handle this but I need to match up the two properties
  $b = $b1 + "`t" + $b2
  $b >> $redirectListFile
}
# We should be done here
于 2013-07-29T11:02:10.637 回答