2017-03-10 325 views
1

我已经找了几个星期,并有其他人研究/ /我,但我还没有找到答案。远程服务器上执行远程PowerShell脚本

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

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

  1. 步骤的作业1使用PowerShell脚本下载
  2. 工作的第2步需要执行服务器上的1脚本解密文件文件(**这是我在这里谈论的步骤)
  3. 作业的第3步将运行powershell脚本来检查文件属性(上次写入日期,与昨天相比的文件大小等)
  4. 步骤4的作业将恢复日志文件

服务器1上的脚本在本地运行时没有任何问题,并产生预期的结果。当试图让服务器2在服务器1上执行脚本时,我没有取得任何成功。为了尽可能简单地找出哪些实际上不起作用,我想出了一套简单的脚本(见下文)。

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

我不是任何类型的PowerShell导师 - 所以我现在很抱歉,如果这是一个非常明显的事情。 :)

#------------------------------------- 
# 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:在Windows Server 2008 R2标准使用PowerShell 2
  • 服务器2:在Windows Server 2012 R2数据中心使用PowerShell 4

额外笔记

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

'调用命令-Session $会议-ScriptBlock {使用调用-表达$:CMD}' – BenH

+0

我做了这一变化,并在服务器1中的脚本没有执行(不创建的文本文件)。我必须为invoke-expression部分添加双引号才能工作,但这不应改变您所谈论的内容。它成功运行且没有错误,但文本文件未创建。 –

回答

1

BenH是正确的。你有两个选择。您可以使用

  1. 调用命令执行{代码块}
  2. 连接-PSSession可连接到电脑作为给定用户

调用命令是做的更快的方法因为它自动建立一个PSSession,执行代码,然后把它撕下来。问题在于它不允许你控制哪个用户建立会话。为此,您必须自己构建会话,然后告诉Invoke-Command将使用哪个会话。因此,尝试这样的事情:

  1. 从:服务器 $证书= GET-凭证#这可以编写脚本,而不是提示。去谷歌上查询。
  2. 从:服务器新PSSesssion -ComputerName Server1的-Credential $证书
  3. 从:服务器现在,您可以连接到会议并启动你的代码,或者使用调用命令只推一个命令到会话:
    1. 连接-PSSession将-Session(GET-的PSSession)
    2. 调用命令-Session(获取会话)-ScriptBlock {C:/script1.ps1}
+0

我很欣赏这个回应。我创建一个会话,你在步骤2中提到我的步骤3中的不同之处在于,最终运行脚本是不是本地服务器1.在步骤3中,这将需要脚本本地服务器1,正确的?原因是,当我传递文件名与之合作时,我无法正确解析文件名和路径。我已经尝试了所有我发现的与逃逸和双斜杠等,但没有成功。如果我有脚本生命并在服务器2上运行,那么稍后进行故障排除似乎是一个更简单的过程。 –

+0

所以这听起来像一个语法问题?不是一个远程问题?请列出您正在尝试的命令。 –

+0

我改剧本2如下:调用命令-Session $会议-ScriptBlock { “援引-表达{使用$:CMD}” –

相关问题