我一辈子都想不出如何让我的代码远程工作,以显示与本地运行时相同的信息。
例如,如果我在Web服务器上本地运行命令:
Get-ChildItem IIS:SSLBindings
我得到以下结果:
但如果我使用以下代码远程运行该命令:
Invoke-command -computer $Computer { Import-Module WebAdministration; Get-Childitem -Path IIS:\SslBindings }
我得到这样的结果:
我不明白为什么站点信息为空,或仅显示...“”。
我已经尝试了各种不同的变体/脚本块,但结果总是一样的。
有人知道我做错了什么吗?或者我如何才能正确地远程提取这些信息?
2条答案
按热度按时间xuo3flqw1#
我觉得可能有更好的方法来做到这一点,因为这感觉有点笨重,但不管怎么样,它的工作...
下面是我用来远程收集此信息的命令:
其结果是:
jyztefdp2#
**此特定属性为何会有问题:**原因在于
Sites
的值是如何产生的。此特定属性恰好是“ScriptProperty”,这表示它是由WebAdministration模块中定义的指令码所提取。该指令码会在幕后以透明方式执行。不幸的是,ScriptProperties在透过PSRemoting存取时,通常无法在还原序列化程序中继续存在。那么,如何确定该属性是否为ScriptProperty呢?通过将命令传输到
Get-Member
来检查成员定义。当在本地运行时,您可以看到
Sites
成员类型是ScriptProperty,并且定义显示了它为获取数据而运行的脚本的开始。当远程运行时,您可以看到类型更改为前缀为“Deserialized”的类型,成员类型现在为NoteProperty,并且定义更改为没有值的字符串。
**如何解决问题:**获得所需值的最简单方法是使用calculated properties将输出转换为可以发送回来的内容。类似于this answer,但更简洁一些:
输出量: