在远程服务器

时间:2017-03-10 22:46:06

标签: powershell invoke-command

我已经找了好几个星期,还有其他人为我做过研究,但我还没找到答案。

我有一个存在于服务器1上的脚本,需要使用某些凭据在服务器1上执行。最终的解决方案将有助于解密文件。该脚本必须作为某个服务器上的某个用户执行,因为该密钥对位于该服务器上用户的密钥环中。

我希望从服务器2调用脚本,作为更大进程的一部分。服务器2有一个sql作业,它具有以下流程:

  1. 作业的第1步使用powershell脚本下载文件
  2. 作业的第2步需要在服务器1上执行脚本来解密文件(**这是我在这里讨论的步骤)
  3. 作业的第3步将运行powershell脚本来检查文件属性(最后写入日期,与昨天相比的文件大小等)
  4. 作业的第4步将恢复日志文件
  5. 服务器1上的脚本在本地运行,没有任何问题,并产生预期的结果。当试图让服务器2在服务器1上执行脚本时,我没有取得任何成功。为了尽可能简单地找出实际上不起作用的东西,我想出了一套简单的脚本(见下文)。

    • 当我在服务器1(文件存在的地方)上运行脚本1时,它 工作良好。文本文件在文件中以“hello world”生成。
    • 当我在服务器2上运行脚本2时(我没有保存文件, 只是在ISE窗口中运行它,它运行没有错误或警告, 但是应该写入的文件在服务器1上不存在(也不存在 服务器2 - 不是它应该,但我检查了看无论如何)。

    我不是任何类型的权威大师 - 所以我现在道歉,如果这是一个非常明显的事情。 :)

    #-------------------------------------
    # script 1
    # this script lives on server 1
    # file name: c:\deleteme\helloworld2.ps1
    
    $CMD = Invoke-Expression " `"hello world`" >> C:\deleteme\helloworld.txt"
    Invoke-Command -ScriptBlock { $CMD }
    
    
    
    #-------------------------------------
    # script 2
    # this script is executed on server 2 and attempts to execute the script on server 1
    
    $session = New-PSSession -ComputerName "SERVER01.lahcg.com" #-Credential $username
    
    
    $CMD = "Invoke-Command -ScriptBlock { powershell.exe `"C:\deleteme\helloworld2.ps1`" } "
    #write-output $CMD
    Invoke-Command -Session $session -ScriptBlock { $CMD }
    
    Remove-PSSession $session  
    

    环境信息:

    • 服务器1:带有Powershell 2的Windows Server 2008 R2标准版
    • 服务器2:带有Powershell 4的Windows Server 2012 R2数据中心

    额外备注

    • 我确实启用了远程设置ok ...我之前在研究时发现了。
    • 我使用的是不同版本的Powershell,但由于服务器1上的脚本在本地运行正常,我认为这不是问题。
    • 我已经获得了凭据部分来处理另一个脚本 - 所以我不是在这篇文章中询问。我把它留在了剧本中,注释出来供参考。

1 个答案:

答案 0 :(得分:1)

BenH是对的。你有两个选择。你可以使用

  1. Invoke-Command执行{Code block}
  2. Connect-PSSession以给定用户身份连接到计算机
  3. Invoke-Command是更快的方法,因为它自动建立PSSession,执行代码,然后撕下它。它的问题是它不允许您控制哪个用户建立会话。为此,您必须自己构建会话,然后告诉Invoke-Command使用哪个会话。所以尝试这样的事情:

    1. 发件人:Server2 $ Credentials = Get-Credential#这可以编写脚本而不是提示。谷歌吧。
    2. 发件人:Server2 New-PSSesssion -ComputerName Server1 -Credential $ Credentials
    3. 发件人:Server2 现在,您可以连接到会话并启动代码,也可以使用invoke-command将单个命令推送到会话:
      1. Connect-PSSession -Session(Get-PSSession)
      2. Invoke-Command -Session(Get-Session)-ScriptBlock {C:/script1.ps1}