gpt4 book ai didi

带有包含的 Powershell PS session 脚本文件

转载 作者:行者123 更新时间:2023-12-03 01:17:25 24 4
gpt4 key购买 nike

所以我尝试使用 Enter-PSSession 对远程机器运行 powershell 脚本.我可以连接并运行单个脚本文件,其内容没有问题。然而,当我运行这个:

.\RemoteFile.ps1 "dev-web01" "builder" "test" "2.5.0.0" "Web" ".\stage_properties.xml"

如您所见,此脚本有 5 个参数。
参数 (

[Parameter(Mandatory=$true)]
$Computername,
[Parameter(Mandatory=$true)]
$Username,
[Parameter(Mandatory=$true)]
$Password,
[Parameter(Mandatory=$true)]
$Version,
[Parameter(Mandatory=$true)]
$Packagenames,
[Parameter(Mandatory=$true)]
$Propfile

)

$securePassword = ConvertTo-SecureString -AsPlainText -Force $Password
$cred = New-Object System.Management.Automation.PSCredential $Username, $securePassword

Enter-PSSession -ComputerName $Computername -Credential $cred
Invoke-Command -ComputerName $Computername -Credential $cred -FilePath
.\DeploymentRun.ps1 -ArgumentList $Propfile -EnableNetworkAccess

当它开始运行 Invoke-Command$Propfile参数 (stage_properties.xml) ,它正在查看远程计算机,因为我假设位置上下文已更改,而不是 RemoteFile.ps1 和 DeploymentRun.ps1 所在的同一本地目录。这是我收到的错误:

Cannot find path 'C:\User\builder\Documents\stage_properties.xml' because it does not exist.

我该如何解决这个问题?我做了一些搜索,但似乎找不到解决方案。

任何意见是极大的赞赏。

最佳答案

和你描述的一样;您传递的文件名是相对于本地计算机的路径,因此在远程计算机上运行的代码无法在该路径中找到文件。

由于您只是在远程机器上运行代码,因此无法“绕过”它。结果被序列化并发送回调用客户端。

您最好的选择可能是将文件内容作为参数而不是文件本身发送。然后当然必须修改目标脚本来处理它。

您还可以将路径作为 UNC 路径传递给本地计算机上的共享,甚至可能是管理共享,例如 \\localmachine\c$\users\builder\documents\stage_properties.xml。 .但是您可能会遇到身份验证问题(双跳)。

(不)相关问题:

你为什么使用 Enter-PSSession然后使用 Invoke-Command ?

根据您的评论进行编辑:

首先,如果你想在单个 session 中对远程机器进行多次调用,首先创建一个 PSSession:

$session = New-PSSession -ComputerName $ComputerName

然后在所有后续调用中使用该 session :

Invoke-Command -Session $session -File $filename
Invoke-Command -Session $session -ScriptBlock {
# Some code
}

完成后关闭 session :

Remove-PSSession -Session $session

请注意 Enter-PSSession纯粹用于交互用途。您通常不会在脚本中使用它。但它也需要 -Session可以使用先前创建的 session 的参数。

至于调用多个文件的问题,你这里有几个泡菜。首先,让我们记住,当您调用 Invoke-Command-File参数,这就像你自己读取文件的内容,用它制作一个脚本 block ,然后将它传递给脚本 block 。

所有这些命令都在远程端进程的上下文中执行。因此,如果这些脚本引用任何资源,包括其他脚本、模块等,则必须从远程执行的上下文中访问这些资源。

基于此,理论上您可以将所有这些文件放在一个共享上,双方都可以访问,并使用 UNC 路径。

实际上,您有一个不同的问题: The so-called "double hop" authentication problem这可以防止远程计算机委派您的凭据。这意味着一旦您对远程计算机进行了身份验证,就不能将您的凭据传递给第三台计算机(例如托管 UNC 共享的文件服务器)。

在大多数关于此的文章(包括我链接的文章)中,他们将讨论通过使用 CredSSP “启用”多跳。在没有完全理解的情况下启用 CredSSP 很容易。在我看来,这通常不是一个好的解决方案;在大多数情况下,你想重新思考你是如何做事的。

回到这个案例:

如果您的脚本文件不需要调用或引用其他脚本文件,那么您可以轻松地执行多个 Invoke-Command调用,依次执行每个调用。

您谈到了解决问题的可能方法:首先将所有文件复制到目标机器。您只需要确保脚本中使用的路径可以正常工作(如果您将其作为参数传递,这不是问题!)。

您可以做的另一件事:不要远程执行代码!只需在本地运行它。

但我想这是不可能的,否则你不会尝试远程处理,所以你可以做的是在远程机器上创建一个计划任务(或一系列任务)(它们只能是按需任务)。

然后,您可以将远程调用减少到以下内容:

Invoke-Command -Session $session -ScriptBlock {
# PowerShell 3.0+
Start-ScheduledTask -TaskName 'My Special Task'

# Any version of PS
schtasks.exe /RUN /TN "My Special Task"
}

关于带有包含的 Powershell PS session 脚本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26269370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com