我正在使用脚本将文件夹从UNC路径复制到本地服务器。我通过交互式会话远程运行脚本并使用Invoke-Command -ScriptBlock,如下所示:
Invoke-Command -ComputerName MyServer -ScriptBlock $Script
这是进行复制的脚本:
$script {
try {
New-PSDrive -Name MyDrive -PSProvider FileSystem -Root \\uncpathserver\e$\SourceCode\ -Credential Contoso\me
Copy-Item -Path \\uncpathserver\e$\SourceCode\* -Destination E:\Inetpub\Target -Recurse -Force
}
catch {
Write-Host "Failed to copy!"
}
}
失败并且每次都抛出我的拦截块。我无法弄清楚我缺少什么才能让它发挥作用 - 这看起来很简单,我希望我不会错过任何明显的东西。
编辑:
我现在只能从本地PC而不是从服务器运行脚本来使其工作。我现在也在调用$ script块中的文件副本。这就是新代码的样子:
$MyServers= @("server-01", "server-02")
foreach ($server in $MyServers)
{
$TargetSession = New-PSSession -ComputerName $server -Credential
contoso\me
Copy-Item -ToSession $TargetSession -Path C:\Source\TheCode\ -
Destination "E:\InetPub\wherethecodegoes" -Recurse -Force
}
我在$ script块中所做的其他事情(为了排除故障而在此省略)正在进行A-OK。我必须为每台服务器输入我的凭据,但由于我使用的服务器性质较小,这不是一个交易破坏者。
答案 0 :(得分:0)
听起来像' kerberos double hop '问题
<强>短应答强>
避免问题。在您的系统中,设置两个 PSdrives。然后将\\uncpathserver\e$\SourceCode\
复制到\\RemoteIISserver\E$\Inetpub\Target\
<强>长应答强>
从您的系统(系统A),您正在远程执行将复制远程文件夹(来自系统C)的脚本(在系统B上)。
它应该有用,但它没有。这是因为当您(特别是您的帐户)来自System A
时,会远程连接到System B
,然后向System C
询问某些内容,&#39;系统C&#39;不信任你。
然而,问题的快速谷歌将展示围绕这个问题的无数方法;
与PowerShell一起使用的一个secure方法可以利用委派。 设置这可能有点令人生畏,我建议你仔细阅读。
## Module 'ActiveDirectory' from RSAT-AD-PowerShell Windows feature required.
$ServerA = $Dnv:COMPUTERNAME
$ServerB = Get-ADComputer -Identity ServerB
$ServerC = Get-ADComputer -Identity ServerC
代表&#39;服务器B&#39;访问服务器C&#39;;
# Set the resource-based Kerberos constrained delegation
Set-ADComputer -Identity $ServerC -PrincipalsAllowedToDelegateToAccount $ServerB
# Confirm AllowedToActOnBehalfOfOtherIdentity.Access is correct (indirectly).
Get-ADComputer -Identity $ServerC -Properties PrincipalsAllowedToDelegateToAccount
等待大约15分钟的服务器B&#39;同步(或只是重启)。
您可以使用以下命令强制执行此操作(注意:$Cred
应包含您的凭据);
Invoke-Command -ComputerName $ServerB.Name -Credential $cred -ScriptBlock {
klist purge -li 0x3e7
}
运行test-hop;
Invoke-Command -ComputerName $ServerB.Name -Credential $cred -ScriptBlock {
Test-Path \\$($using:ServerC.Name)\C$
Get-Process lsass -ComputerName $($using:ServerC.Name)
Get-EventLog -LogName System -Newest 3 -ComputerName $($using:ServerC.Name)
}
缺点是您必须以这种方式设置每个远程目标(每个&#39;服务器C&#39;)。但好处是它的安全性。