【问题标题】:PowerShell Remote sessions and scope question: Commands appear to run locallyPowerShell 远程会话和范围问题:命令似乎在本地运行
【发布时间】:2011-01-12 20:55:57
【问题描述】:

这是一个示例脚本,它尝试在服务器上创建远程会话,然后使用 WMI 获取服务器的 IIS 应用程序池列表,并列出它们的名称:

    function Test-Remoting
    {
        [CmdletBinding()]
        param
        (    
        )
        begin
        {
            Enter-PSSession TestServer
            $appPools = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" -Authentication 6
            $appPools | ForEach-Object {
                $appPool = $_;
                $appPool.Name
            }
            Exit-PSSession
        }    
    }

此函数包含在名为“Test-Remoting.ps1”的文件中。我打开 PowerShell,CD 到包含这个文件的目录,点源文件,然后调用函数:

PS C:\Users\moskie> . .\Test-Remoting.ps1
PS C:\Users\moskie> Test-Remoting

但是这个脚本的结果是我的本地机器上的应用程序池列表,不是TestServer。

或者,如果我在 PowerShell 提示符下手动运行以下行(与函数中的行相同),我确实会获取远程服务器上的应用程序池列表:

PS C:\Users\moskie> Enter-PSSession TestServer
[TestServer]: PS C:\> $appPools = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" -Authentication 6
[TestServer]: PS C:\> $appPools | ForEach-Object { $appPool = $_; $appPools.Name }
<a list of the names of the application pools on TestServer>
[TestServer]: PS C:\>

我认为我忘记了一个关于 PowerShell 远程处理和范围的概念。谁能帮忙解释一下这种行为?

【问题讨论】:

    标签: powershell powershell-remoting


    【解决方案1】:

    我相信 Enter/Exit-PSSession 意味着更多的交互使用。来自 Enter-PSSession 帮助:

    SYNOPSIS
        Starts an interactive session with a remote computer.
    

    在脚本中,像这样使用 New-PSSession 和 Invoke-Command:

    $session = New-PSSession server01
    Invoke-Command -Session $session {hostname}
    Remove-PSSession -Session $session
    

    更新:要远程执行完整的脚本,请使用 Invoke-Command 上的 FilePath 参数:

    icm server01 -FilePath C:\users\keith\myscript.ps1 -arg 1,2
    

    这会将脚本复制到远程计算机 server01 并使用提供的参数在那里执行它。

    【讨论】:

    • 我会试一试,但我想避免这样的变通方法,因为我要运行的脚本非常复杂。必须通过 Invoke-Command 运行每个命令会很痛苦。使用 Enter/Exit-PSSession 是最方便的,因为我只需要用这些命令包围我的脚本。
    • 如果是脚本,那么你可以这样做Invoke-Command -FilePath myscript.ps1,PowerShell会将文件移动到远程机器并在那里执行。
    • 谢谢,我最终选择了这条路线,所以我会将您的路线标记为答案。但是这个“交互式”会话的概念有点模糊......对我来说,当我有一个脚本执行一个命令进入一个新会话时,它后面的命令将在那个新会话中运行,这似乎是合乎逻辑的.猜不...再次感谢!
    • 是的,它似乎打破了“您在提示符下键入的任何内容都可以粘贴到脚本中并工作”的模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多