【问题标题】:Why does the IIS7 behaves differently through invoke-command?为什么 IIS7 通过调用命令表现不同?
【发布时间】:2015-01-09 02:30:34
【问题描述】:

我观察到 IIS7 CLI 实用程序 appcmd 在通过调用命令调用时的这种奇怪行为。

这是我正在尝试执行的一小段命令。

PS C:\>appcmd list config /section:applicationPools | Select-String -SimpleMatch "SomeAppPool" -context 0,4 | Out-String -Stream | Select-String " pingingEnabled=""true"""

该命令执行得非常好[在设置了所有 %PATH% 变量的 IIS7 机器上完成]。我得到像

这样的输出
<processModel pingingEnabled="true" />

通过远程机器的调用命令完成同样的事情。

远程版本-I

PS C:\>invoke-command -computername iismachine -credential $creds -scriptblock {
    appcmd list config /section:applicationPools | Select-String -SimpleMatch "SomeAppPool" -context 0,4 | Out-String -Stream | Select-String " pingingEnabled=""true"""
}

没有输出,只有三个空行!!!

虽然如果我通过创建一个远程 powershell 会话来做到这一点,它开始工作正常..

远程版本-II

PS C:\>enter-pssession -computername iismachine -credential $creds;
[iismachine]: PS C:\Users\onewildgamer\Documents>invoke-command -scriptblock {
    appcmd list config /section:applicationPools | Select-String -SimpleMatch "SomeAppPool" -context 0,4 | Out-String -Stream | Select-String " pingingEnabled=""true""" 
}

既然行为有所不同,我不怀疑用户权限问题。

如果我做错了什么,请告诉我。我一生都无法弄清楚为什么这不起作用。

【问题讨论】:

    标签: powershell powershell-remoting invoke-command appcmd


    【解决方案1】:

    我怀疑这实际上是权限和/或双跳问题。

    首先,Remote Version-II 不在远程机器上执行。在没有-ComputerName-PSSession 参数的情况下调用Invoke-Command 会在本地机器上执行脚本块。

    首先启动会话的正确方法是使用New-PSSession,然后将其返回值传递给Invoke-Command-PSSession参数:

    $session = New-PSSession -ComputerName iismachine -Credential $creds
    Invoke-Command -PSSession $session -ScriptBlock { #code }
    

    如果您尝试这种方式,您可能会看到它停止工作。

    疑难解答:

    Invoke-Command -computername iismachine -credential $creds -scriptblock {
        appcmd list config /section:applicationPools # | Select-String -SimpleMatch "SomeAppPool" -context 0,4 | Out-String -Stream | Select-String " pingingEnabled=""true"""
    }
    

    这消除了所有其他东西,我认为这可能会掩盖错误消息。通过以这种方式运行它,您应该会看到原始输出,并且可能会更好地了解正在发生的事情。

    通常使用Invoke-Command,您会遇到双跳身份验证问题,即您在远程会话中运行的命令尝试使用当前凭据对资源进行身份验证,但无法做到。即使资源不是远程计算机的远程资源,有时也会出现这种情况,而 IIS 就是我见过的情况之一。

    appcmd 调用也有可能是成功的,但它的输出与您意料之外的不同,而您的 Select-String 调用通过给您空白行来掩盖这一点。

    【讨论】:

    • 远程版本-II 中的调用命令实际上是在远程机器的提示符内。我忘了补充。我马上修改。
    • 明白。我仍然认为您尝试故障排除代码以查看原始输出是什么。
    • 使用带有 pssession 的 invoke-command 没有任何区别。尝试注释掉其余部分,它给出了整个 xml 部分。另一个有趣的事情是,使用 write-host 打印完整命令的输出而不删除管道正在打印输出,但我仍然不明白为什么默认情况下不会产生任何输出。
    猜你喜欢
    • 2015-04-18
    • 2011-06-17
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2022-11-09
    相关资源
    最近更新 更多