【问题标题】:reformatting `GCI IIS:\SSLBindings` to avoid truncation重新格式化 `GCI IIS:\SSLBindings` 以避免截断
【发布时间】:2020-06-05 00:55:52
【问题描述】:

我的 Windows 2016 服务器上有 8 个 IIS 站点。 6 个由相同的多 SAN 证书覆盖,2 个具有不同的证书。

GCI IIS:\SSLBindings 用省略号截断列表:

    IP Address          Port   Host Name        Store            Sites
    ----------          ----   ---------        -----            -----
                        443                     CentralCertStore QA.ARIAUTODIRECT.COM
                                                                 QA.ARIBUYDIRECT.COM
                                                                 QA.ARIDEALERDIRECT.CA
                                                                 QA.ARIDEALERDIRECT.COM
                                                                 QA.ARITRUCKDIRECT.COM
                                                                 ...
    0.0.0.0             443                     WebHosting       QA.ARIAUTODIRECT.COM

第一组中的每个站点都有一个针对 *:443:主机名 的 SSL 绑定——即,所有 IP、端口 443、需要 SNI 并指定主机名。最后一个绑定是不需要 SNI 且未指定主机名的默认绑定,用于不支持 SNI 的旧浏览器。

我真正希望看到的输出是这样的,其格式适合电子邮件报告:

    IP Address          Port   Host Name (SNI)          Store            SiteName
    ----------          ----   ---------                -----            -----
    *                   443    QA.ARIAUTODIRECT.COM     CentralCertStore QA.ARIAUTODIRECT.COM
    *                   443    QA.ARIBUYDIRECT.COM      CentralCertStore QA.ARIBUYDIRECT.COM
    *                   443    QA.ARIDEALERDIRECT.CA    CentralCertStore QA.ARIDEALERDIRECT.CA
    *                   443    QA.ARIDEALERDIRECT.COM   CentralCertStore QA.ARIDEALERDIRECT.COM
    *                   443    QA.ARITRUCKDIRECT.COM    CentralCertStore QA.ARITRUCKDIRECT.COM
    *                   443    QA.VR.ARITRUCKDIRECT.COM CentralCertStore QA.VR.ARITRUCKDIRECT.COM
    *                   443    OPSSCQA.ARIFLEET.COM     CentralCertStore OPS -SC- QA
    0.0.0.0             443    -none-                   WebHosting       QA.ARIAUTODIRECT.COM

我一直在破解 PowerShell 脚本,试图克服有关无法将 $null 更改为字符串或将整数更改为字符串等的警告。所以我要退后一步并询问我是否有任何明显的方法可以做到这一点。

作为一个例子,这是我尝试过的。它只显示站点名称,没有标题。

PS C:\windows\system32> dir iis:\sslbindings |%{ 
    $x = $_; $paths = $x.Sites |%{ $_.ItemXPath.Split("'")[1]}; 
    Add-Member -inputobject $_ -membertype NoteProperty -Name "SiteName" -Value $paths; 
    $_.SiteName } |FT
QA.ARIAUTODIRECT.COM
QA.ARIBUYDIRECT.COM
QA.ARIDEALERDIRECT.CA
QA.ARIDEALERDIRECT.COM
QA.ARITRUCKDIRECT.COM
QA.VR.ARIAUTODIRECT.COM
OPS -SC- QA
ARIXSSQA
QA.ARIAUTODIRECT.COM

编辑:@thepip3r 的answer 尝试的结果。 (可能我稍后会删除此编辑,因为它并没有真正添加到问题中,但让我对 pip3r 的答案给出格式正确的回复)

给定的:

IpAddress    : 
Port         : 443
Hostname_SNI : 
Store        : CentralCertStore
Site         : {QA.ARIAUTODIRECT.COM, QA.ARIBUYDIRECT.COM, QA.ARIDEALERDIRECT.CA, QA.ARIDEALERDIRECT.COM...}

IpAddress    : 0.0.0.0
Port         : 443
Hostname_SNI : 0.0.0.0
Store        : WebHosting
Site         : QA.ARIAUTODIRECT.COM

当 FT 添加到管道时:

IpAddress Port Hostname_SNI Store            Site                                                                                         
--------- ---- ------------ -----            ----                                                                                         
           443              CentralCertStore {QA.ARIAUTODIRECT.COM, QA.ARIBUYDIRECT.COM, QA.ARIDEALERDIRECT.CA, QA.ARIDEALERDIRECT.COM...}
0.0.0.0    443 0.0.0.0      WebHosting       QA.ARIAUTODIRECT.COM

【问题讨论】:

    标签: powershell iis-10


    【解决方案1】:

    第一次尝试:

    Import-Module WebAdministration
    
    $SslBindings = @(gci IIS:\SslBindings)
    
    if ($SslBindings.count -gt 0) {
        foreach ($Binding in $SslBindings) {
            [pscustomobject]@{
                'IpAddress'    = $Binding.IpAddress.IpAddressToString
                'Port'         = $Binding.Port
                'Hostname_SNI' = ($Binding.PSPath | Split-Path -Leaf).Split('!')[0]
                'Store'        = $Binding.Store
                'Site'         = $Binding.Sites.Value
            }
        }
    }
    

    【讨论】:

    • 还没有完全获胜。以下是它的输出:pastebin.com/raw/QBVBMhfa 除了包含数组中的所有站点名称的组(即 Site 数组的值)之外,PSPath 也出现空白,这可能也是因为 SSLBindings 将每个站点上的绑定折叠成一个,因为我不太明白的原因。
    • @RossPresser,这都是关于每个底层数据类型的——其中每个数据组件都存储在每个 $Binding 实例的树结构对象中,以及它们是什么类型的数据(例如字符串、整数、数组、集合等)。不幸的是,我只有一个带有单个站点的 Web 服务器来测试它。此外,我无法从我的公司环境访问 pastebin,因此我看不到屏幕截图。当我可以使用可以看到屏幕截图(或任何内容)的设备时,我会尽快回复
    • 更新:我将 pastebin 的纯文本内容复制到我的问题中,以便您查看。我非常感谢你的尝试。我已经学到了一些我不知道的东西 (Split-Path -Leaf FTW)
    • 赞成,因为您帮助我找到了我想要的格式化解决方案!
    【解决方案2】:

    更好的答案

    Get-WebBinding 产生的解决方案比IIS:\WebBindings 好得多。

     Get-WebBinding -Protocol https `
       |%{ 
          $bi = $_.bindingInformation.Split(":");
          [PsCustomObject]@{
            'IpAddress' = $bi[0]
            'Port' = $bi[1]
            'Hostname_SNI' = $bi[2]
            Store = $( if ($_.sslFlags -eq 3) {"CentralCertStore"} else {$_.certificatestorename} )
            SiteName = $_.ItemXPath.split("'")[1]
          }
        } |ft
    

    结果:

    IpAddress     Port Hostname_SNI            Store            SiteName               
    ---------     ---- ------------            -----            --------               
    *             443                          WebHosting       QA.ARIAUTODIRECT.COM   
    *             443  qa.ariautodirect.com    CentralCertStore QA.ARIAUTODIRECT.COM   
    *             443  qa.aribuydirect.com     CentralCertStore QA.ARIBUYDIRECT.COM    
    *             443  qa.aridealerdirect.ca   CentralCertStore QA.ARIDEALERDIRECT.CA  
    *             443  qa.aridealerdirect.com  CentralCertStore QA.ARIDEALERDIRECT.COM 
    *             443  qa.aritruckdirect.com   CentralCertStore QA.ARITRUCKDIRECT.COM  
    *             443  qa.vr.ariautodirect.com CentralCertStore QA.VR.ARIAUTODIRECT.COM
    *             443  OPSSCQA.ARIFLEET.COM    CentralCertStore OPS -SC- QA            
    10.220.100.98 443  arixssqa.arifleet.com   CentralCertStore ARIXSSQA            
    

    以前的答案

    感谢我从the answer by @thepip3rSplit-Path -Leaf[pscustomobject]@{...})学到的两件事,我已经克服了格式化问题。空白 Hostname_SNI 问题仍然存在,这是由于绑定折叠造成的。我猜是因为每个绑定都使用 *:443、SNI 和 CCS,所以它会将它们折叠在一起。这仍然有点无法解释,因为这些绑定实际上有主机名。但我现在对此很满意。

    import-module webadministration
    dir iis:\sslbindings `
     |%{ $Binding = $_
         $Binding.Sites.ItemXPath |%{ $_.split("'")[1] } `
         |% { 
            [pscustomobject]@{
                'IpAddress'    = $( $ip = $Binding.IpAddress.IpAddressToString; if ([String]::IsNullOrWhiteSpace($ip)) { "*" } else { $ip } )
                'Port'         = $Binding.Port
                'Hostname_SNI' = $( $h = ($Binding.PSPath | Split-Path -Leaf).Split('!')[0]; if ([String]::IsNullOrWhiteSpace($h)) { "--none--" } else {$h} )
                'Store'        = $Binding.Store
                'SiteName'     = $_
            }
         }
     } |ft
    

    输出:

    IpAddress Port Hostname_SNI Store            SiteName               
    --------- ---- ------------ -----            --------               
    *          443 --none--     CentralCertStore QA.ARIAUTODIRECT.COM   
    *          443 --none--     CentralCertStore QA.ARIBUYDIRECT.COM    
    *          443 --none--     CentralCertStore QA.ARIDEALERDIRECT.CA  
    *          443 --none--     CentralCertStore QA.ARIDEALERDIRECT.COM 
    *          443 --none--     CentralCertStore QA.ARITRUCKDIRECT.COM  
    *          443 --none--     CentralCertStore QA.VR.ARIAUTODIRECT.COM
    *          443 --none--     CentralCertStore OPS -SC- QA            
    *          443 --none--     CentralCertStore ARIXSSQA               
    0.0.0.0    443 0.0.0.0      WebHosting       QA.ARIAUTODIRECT.COM  
    

    【讨论】:

    • 太棒了——很高兴你能解决这个问题。抱歉,我帮不上忙——愚蠢的高安全环境!另外,看着你的代码,让我感叹缺少内置的三元运算符!!!祝你报告好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2012-12-13
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多