使用PowerShell调用-在本地运行命令尝试获取SSLBinding时,命令不提供相同的IIS信息

aiazj4mn  于 2022-11-12  发布在  Shell
关注(0)|答案(2)|浏览(136)

我一辈子都想不出如何让我的代码远程工作,以显示与本地运行时相同的信息。
例如,如果我在Web服务器上本地运行命令:

Get-ChildItem IIS:SSLBindings

我得到以下结果:

但如果我使用以下代码远程运行该命令:

Invoke-command -computer $Computer { Import-Module WebAdministration; Get-Childitem -Path IIS:\SslBindings }

我得到这样的结果:

我不明白为什么站点信息为空,或仅显示...“”。
我已经尝试了各种不同的变体/脚本块,但结果总是一样的。
有人知道我做错了什么吗?或者我如何才能正确地远程提取这些信息?

xuo3flqw

xuo3flqw1#

我觉得可能有更好的方法来做到这一点,因为这感觉有点笨重,但不管怎么样,它的工作...
下面是我用来远程收集此信息的命令:

$SSLCertInUseInfo = Invoke-command -computer $Computer {
                                Import-Module WebAdministration; Get-Childitem -Path IIS:\SslBindings | Select IPAddress, Host, Port, Store,
                             @{ Name = 'Site'; Expression = { $_ | select -property Sites -expandproperty Sites | Select-Object -ExpandProperty "Value" } }
                             } | Select -Property * -ExcludeProperty PSComputerName, RunSpaceID, PSShowComputerName

其结果是:

jyztefdp

jyztefdp2#

**此特定属性为何会有问题:**原因在于Sites的值是如何产生的。此特定属性恰好是“ScriptProperty”,这表示它是由WebAdministration模块中定义的指令码所提取。该指令码会在幕后以透明方式执行。不幸的是,ScriptProperties在透过PSRemoting存取时,通常无法在还原序列化程序中继续存在。

那么,如何确定该属性是否为ScriptProperty呢?通过将命令传输到Get-Member来检查成员定义。
当在本地运行时,您可以看到Sites成员类型是ScriptProperty,并且定义显示了它为获取数据而运行的脚本的开始。

PS C:\> Get-Childitem -Path IIS:\SslBindings | Get-Member Sites

   TypeName: System.Management.Automation.PSCustomObject

Name  MemberType     Definition
----  ----------     ----------
Sites ScriptProperty System.Object Sites {get=$ip = [string]::empty...

当远程运行时,您可以看到类型更改为前缀为“Deserialized”的类型,成员类型现在为NoteProperty,并且定义更改为没有值的字符串。

PS C:\> Invoke-Command -ComputerName $Computer { Import-Module WebAdministration;Get-Childitem -Path IIS:\SslBindings } | Get-Member Sites

   TypeName: Deserialized.System.Management.Automation.PSCustomObject

Name  MemberType   Definition
----  ----------   ----------
Sites NoteProperty System.String Sites=

**如何解决问题:**获得所需值的最简单方法是使用calculated properties将输出转换为可以发送回来的内容。类似于this answer,但更简洁一些:

Invoke-Command -ComputerName $Computer {
    Import-Module WebAdministration; Get-Childitem -Path IIS:\SslBindings |
    Select-Object IPAddress, Port, Host, Store, @{Name="Sites"; Expression={($_).Sites.Value}} } |
    Select-Object * -ExcludeProperty PSComputerName, RunSpaceID, PSShowComputerName

输出量:

IPAddress : ::
Port      : 443
Host      :
Store     : MY
Sites     :

IPAddress : 0.0.0.0
Port      : 443
Host      :
Store     : My
Sites     : Default Web Site

相关问题