2017-10-19 118 views
0

我正在处理将文件夹从UNC路径复制到本地服务器的脚本。我通过远程交互式会话运行我的脚本,并利用调用命令-ScriptBlock像这样:PowerShell无法从UNC路径复制

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 

    } 

其他的一切我为我的$脚本块(已排除故障的缘故此处省略)内做的工作都OK。我必须为每台服务器输入我的凭据,但由于我正在使用的服务器的性质很小,这不是一个交易断路器。

+1

删除catch块,以便您可以看到错误是什么。 – zdan

+0

找不到路径\\ uncpathserver \ e $ \ SourceCode \,因为它不存在 存在是我收到的错误。 – jnunham

+0

您是否尝试过使用'net use'? –

回答

0

听起来像'kerberos双跳'的问题。

简答

避免此问题。从你的系统中,设置两个 PSdrives。然后\\uncpathserver\e$\SourceCode\复制到\\RemoteIISserver\E$\Inetpub\Target\

长回答

从您的系统(系统A),您远程执行脚本(在系统B),将复制的远程文件夹(从系统C)。

它应该工作,但它没有。这是因为当你(特别是你的账户)从System A,远程连接到System B,然后询问System C的东西,'系统C'不信任你。

这个问题的快速谷歌将显示围绕此问题的无数方法,但是;

  • 并不是所有的方法都是安全的(例如:CredSSP身份)
  • 并不是所有的方法将在您的Windows版本的工作(这是...?)
  • 并不是所有的方法都使用PowerShell
工作

一个secure与PowerShell配合使用的方法利用委派。 这可能有点令人畏惧的设置,我建议你仔细阅读。

## Module 'ActiveDirectory' from RSAT-AD-PowerShell Windows feature required. 
$ServerA = $Dnv:COMPUTERNAME    
$ServerB = Get-ADComputer -Identity ServerB    
$ServerC = Get-ADComputer -Identity ServerC    

委托'服务器B'来访问'服务器C';

# 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'同步(或重新启动它)。 您可以通过以下方式强制执行此操作(注意:$Cred应该包含您的凭据);

Invoke-Command -ComputerName $ServerB.Name -Credential $cred -ScriptBlock {    
    klist purge -li 0x3e7    
} 

运行一个测试跳;

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) 
} 

缺点是你必须以这种方式设置每个远程远程目标(每个“服务器C”)。但好处在于它很安全。