PowerShell无法从UNC路径

时间:2017-10-19 16:27:12

标签: powershell

我正在使用脚本将文件夹从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。我必须为每台服务器输入我的凭据,但由于我使用的服务器性质较小,这不是一个交易破坏者。

1 个答案:

答案 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;不信任你。

然而,问题的快速谷歌将展示围绕这个问题的无数方法;

  • 并非所有方法都是安全的(例如:CredSSP)
  • 并非所有方法都适用于您的Windows版本(即...?)
  • 并非所有方法都适用于PowerShell

与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;)。但好处是它的安全性。