我已经找了几个星期,并有其他人研究/ /我,但我还没有找到答案。远程服务器上执行远程PowerShell脚本
我有一个脚本,位于服务器1上,需要使用某些凭据在服务器1上执行。最终的解决方案将有助于解密文件。该脚本必须作为特定用户在特定服务器上执行,因为密钥对位于该服务器上的用户密钥环中。
我希望从服务器2调用脚本作为更大进程的一部分。服务器2具有它具有以下流SQL作业:
- 步骤的作业1使用PowerShell脚本下载
- 工作的第2步需要执行服务器上的1脚本解密文件文件(**这是我在这里谈论的步骤)
- 作业的第3步将运行powershell脚本来检查文件属性(上次写入日期,与昨天相比的文件大小等)
- 步骤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上的脚本本地运行正常,因此我不认为这是一个问题。
- 我已经获得凭证部分来处理另一个脚本 - 所以我不在此帖中询问。我把它留在脚本中,注释掉以供参考。
'调用命令-Session $会议-ScriptBlock {使用调用-表达$:CMD}' – BenH
我做了这一变化,并在服务器1中的脚本没有执行(不创建的文本文件)。我必须为invoke-expression部分添加双引号才能工作,但这不应改变您所谈论的内容。它成功运行且没有错误,但文本文件未创建。 –