通过invoke-command调用时,我观察到IIS7 CLI实用程序appcmd的这种奇怪行为。
这是我正在尝试执行的一小段命令。
PS C:\>appcmd list config /section:applicationPools | Select-String -SimpleMatch "SomeAppPool" -context 0,4 | Out-String -Stream | Select-String " pingingEnabled=""true"""
该命令执行完全正常[在IIS7机器上完成,其中设置了所有%PATH%变量]。我得到了像
这样的输出<processModel pingingEnabled="true" />
通过来自远程计算机的invoke-command完成同样的事情。
远程版本-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会话来实现它,它开始正常工作..
Remote Version-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"""
}
现在行为存在差异,我不怀疑用户权限问题。
如果我做错了,请告诉我。我无法弄清楚为什么这不起作用。
答案 0 :(得分:1)
我怀疑这实际上是权限和/或双跳问题。
首先,远程版本-II未在远程计算机上执行。在没有Invoke-Command
或-ComputerName
参数的情况下调用-PSSession
会在本地计算机上执行scriptblock。
首先启动会话的正确方法是使用New-PSSession
,然后将其返回值传递给-PSSession
的{{1}}参数:
Invoke-Command
如果你这样尝试,你可能会发现它停止工作。
$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"""
}
会遇到双跳身份验证问题,即您在远程会话中运行的命令会尝试使用当前凭据对资源进行身份验证,但无法执行此操作。即使资源不是远程计算机的远程,有时也可能出现这种情况,IIS就是我见过这种情况的其中一种情况。
Invoke-Command
调用也可能成功,但其输出方式与您预期的方式不同,并且您的appcmd
调用正在掩盖此问题给你空白。