【问题标题】:How to check if a Powershell script is running remotely如何检查 Powershell 脚本是否正在远程运行
【发布时间】:2012-11-03 20:33:27
【问题描述】:

我有一个可以在本地或远程(通过 WinRM)运行的脚本,但是我希望它在远程计算机上运行时的行为略有不同。我意识到我可以向脚本传递一个开关来识别它是在本地运行还是远程运行,但我想知道脚本本身是否可以检测它是否在远程运行?

【问题讨论】:

  • 如何调用远程处理脚本?
  • 我正在使用 Invoke-Command

标签: powershell powershell-remoting


【解决方案1】:

Get-Host 返回Name 等信息:

PS> (Get-Host).Name 控制台主机 PS> (Invoke-Command -ComputerName dev2 -Script {Get-Host}).Name 服务器远程主机

【讨论】:

  • 不错。使用自动变量 $Host 代替 cmdlet 调用 Get-Host 也是一种选择:$Host.Name -eq 'ServerRemoteHost'
  • 我看不出这有什么帮助,除非您传入“本地”计算机的名称以便与它进行比较...
  • @Jaykul PowerShell 主机是运行脚本的软件可执行文件;不是运行该进程的计算机的主机名。因此ConsoleHost 等:这些是显示执行环境的名称。
【解决方案2】:
    if ($PSSenderInfo) {
        "Running remote"
    }
    else {
        "Running local"
    }

【讨论】:

  • 这似乎比预期的答案更好,因为它只在 PSSessions 中有效——但值得注意的是它确实Invoke-Command -Cn . { $PSSenderInfo } 中有效,所以它只告诉如果你是远程处理,而不是技术上你是否在远程计算机上。
  • 现在还有一个问题。你如何获得和 intsall PSSessions
【解决方案3】:

检查$profile 是否已定义对我有用。我不知道这有多可靠,但varioussources 建议远程会话中没有加载任何配置文件。我无法检查计算机名,因为我无法提前知道哪台机器是本地机器,哪台机器是远程机器。

$RunningLocally = $profile -ne $null

【讨论】:

    【解决方案4】:

    您可以在 $MyInvocation 中检查计算机名:

    PS>Invoke-Command -ComputerName smacnt01 -ScriptBlock {$MyInvocation}
    
    PSComputerName   : smacnt01
    RunspaceId       : 333f5333-0ca5-4461-8f38-cb086fbd1ea4
    MyCommand        : $MyInvocation
    BoundParameters  : {}
    UnboundArguments : {}
    ScriptLineNumber : 0
    OffsetInLine     : 0
    HistoryId        : -1
    ScriptName       :
    Line             :
    PositionMessage  :
    InvocationName   :
    PipelineLength   : 1
    PipelinePosition : 1
    ExpectingInput   : False
    CommandOrigin    : Runspace
    

    【讨论】:

    • 感谢 Kayasax 的回复,但我不确定如何使用它来判断脚本是否正在远程运行。除非脚本有某种方法可以获取发起远程调用的计算机的名称,以便将其与 $MyInvocation 中的值进行比较?
    • 在启动调用命令的脚本中,您可以调用 $env:computername no ?
    • 这可行,但我想避免将额外的值传递给脚本,而是让脚本自己解决
    • in $Myinvocation CommandOrigin 在使用远程处理时运行本地而不是运行空间时似乎是“内部”(您必须验证这一点)
    【解决方案5】:

    我认为在你的脚本测试中是可能的

    $myinvocation.mycommand.path -eq $null
    

    那么 if is true 通过 Invoke-command 远程运行。

    我没有准确地测试它,但我认为它可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2010-10-21
      • 1970-01-01
      相关资源
      最近更新 更多