2017-10-19 13 views
0

UNCパスからローカルサーバーにフォルダをコピーするスクリプトを作成中です。私はリモートで対話型のセッションを通じて私のスクリプトを実行しているので、同様に、Invoke-Commandコマンド-ScriptBlockを利用しています:それは失敗し、私を投げているPowerChellがUNCパスからのコピーに失敗しました

$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!" 
} 
} 

Invoke-Command -ComputerName MyServer -ScriptBlock $Script 

これは、コピーを行うためのスクリプトです毎回ブロックをキャッチします。私はこれがうまくいくためには何が欠けているのか分からないようです - それはとても簡単なようです。私は何かをはっきりと見逃していないことを願っています。

EDIT:

は、私はそれが今ちょうど私のローカルPCからではなく、サーバからスクリプトを実行して、仕事を得ることができました。私は今も$ scriptブロックからファイルコピーを呼び出しています。 (トラブルシューティングのためにここでは省略されている)私の$スクリプトブロックは、[OK]を働いているの内側に私がやっている他の

$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 

    } 

すべて:これは、新しいコードは次のようになります。私は各サーバーの資格情報を入力する必要がありますが、私が使用しているサーバーの性質上、それは取引の中断者ではありません。

+1

catchブロックを削除して、エラーの内容を確認します。 – zdan

+0

が存在しないため、\\ uncpathserver \ e $ \ SourceCode \というパスが見つかりませんでした。 – jnunham

+0

代わりに 'net use'を試しましたか? –

答えて

0

'ケルベロスダブルホップ'のような問題があります。

短期回答

問題を避けてください。お使いのシステムから2台の PSドライブをセットアップしてください。次に、あなたのシステム(システムA)、リモート(システムCから)リモートフォルダをコピーします(システムB上の)スクリプトを実行していることから\\RemoteIISserver\E$\Inetpub\Target\

長期回答

\\uncpathserver\e$\SourceCode\をコピーします。

正常に動作するはずですが、そうではありません。これは、あなた(具体的にはあなたのアカウント)がSystem Aで、リモートでSystem Bに接続してから、System Cに「System C」があなたを信用しないと頼むからです。

問題の急速なGoogleは、しかし、この問題の周りに無数の方法を示します。

  • ないすべてのメソッドが(例:の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    

'サーバーC'にアクセスするための代理人 'サーバーB'。

# 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 

「サーバーB」が同期する(または再起動する)のに約15分かかります。 これを強制することができます(注:$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')をこのように設定しなければならないことです。しかし、それは安全であるということがあります。

関連する問題