Salin file dari jarak jauh dengan PowerShell

95

Saya sedang menulis skrip PowerShell yang ingin saya jalankan dari Server A. Saya ingin terhubung ke Server B dan menyalin file ke Server A sebagai cadangan.

Jika itu tidak dapat dilakukan maka saya ingin terhubung ke Server B dari Server A dan menyalin file ke direktori lain di Server B.

Saya melihat Copy-Itemperintahnya, tetapi saya tidak melihat cara memberinya nama komputer.

Saya akan berpikir saya bisa melakukan sesuatu seperti

Copy-Item -ComputerName ServerB -Path C:\Programs\temp\test.txt -Destination (not sure how it would know to use ServerB or ServerA)

Bagaimana saya bisa melakukan ini?

chobo2
sumber
4
Untuk menggunakan Copy-Item Anda harus menggunakan jalur UNC seperti "\\ ServerB \ C $ \ Programs \ temp \ test.txt"

Jawaban:

97

Cukup gunakan saham administratif untuk menyalin file antar sistem. Jauh lebih mudah dengan cara ini.

Copy-Item -Path \\serverb\c$\programs\temp\test.txt -Destination \\servera\c$\programs\temp\test.txt;

Dengan menggunakan jalur UNC dan bukan jalur sistem file lokal, Anda membantu memastikan bahwa skrip Anda dapat dieksekusi dari sistem klien mana pun yang memiliki akses ke jalur UNC tersebut. Jika Anda menggunakan jalur sistem file lokal, maka Anda menyudutkan diri Anda sendiri untuk menjalankan skrip pada komputer tertentu.

Ini hanya berfungsi ketika sesi PowerShell berjalan di bawah pengguna yang memiliki hak untuk kedua saham administratif.

Saya menyarankan untuk menggunakan berbagi jaringan biasa di server B dengan akses hanya-baca untuk semua orang dan cukup hubungi (dari Server A):

Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose
Trevor Sullivan
sumber
9
Satu kemungkinan masalah dengan pendekatan ini adalah bahwa Copy-Item tidak mendukung kredensial alternatif (jika Anda harus menjalankan perintah dengan pengguna yang berbeda). Dalam hal ini, pendekatan New-PSDrive diperlukan.
Yordania
1
Solusi ini hanya berfungsi jika tidak ada firewall di antara host yang memblokir berbagi UNC. Dalam hal ini solusi yang benar ada di bawah ( Copy-Item -FromSession).
Marc
88

Dari PowerShell versi 5 dan seterusnya (disertakan dalam Windows Server 2016, dapat diunduh sebagai bagian dari WMF 5 untuk versi sebelumnya ), ini dimungkinkan dengan melakukan remote. Manfaatnya adalah ia berfungsi meskipun, karena alasan apa pun, Anda tidak dapat mengakses share.

Agar ini berfungsi, sesi lokal tempat penyalinan dimulai harus menginstal PowerShell 5 atau lebih tinggi. Sesi jarak jauh tidak perlu menginstal PowerShell 5 - ia bekerja dengan versi PowerShell serendah 2, dan versi Windows Server serendah 2008 R2. [1]

Dari server A, buat sesi ke server B:

$b = New-PSSession B

Dan kemudian, masih dari A:

Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt

Menyalin item ke B dilakukan dengan -ToSession. Perhatikan bahwa jalur lokal digunakan dalam kedua kasus; Anda harus melacak server apa yang Anda gunakan.


[1]: saat menyalin dari atau ke server jarak jauh yang hanya memiliki PowerShell 2, waspadalah terhadap bug ini di PowerShell 5.1 , yang pada saat penulisan berarti penyalinan file rekursif tidak berfungsi -ToSession, penyalinan yang tampaknya tidak berfungsi di semua dengan -FromSession.

Jeroen Mostert
sumber
3
Saya telah menemukan bahwa kedua server tidak perlu menginstal PS 5. Saya baru saja melakukan tes yang berhasil di mana hanya server sumber (Windows 10) yang menginstal PS 5. Targetnya adalah Windows Server 2012 R2 dengan PS default terpasang ($ PSVersionTable.PSVersion laporan 4).
Taylor Buchanan
2
Jika Anda menggunakan -ToSession pada sumbernya, hanya sumber yang perlu diinstal PS 5. Jika Anda menggunakan -FromSession pada target, hanya target yang perlu menginstal PS 5.
Taylor Buchanan
1
Ini juga berfungsi ketika Anda hanya menginstal Hypervisor (tanpa server), tidak perlu mengatur saham, cukup gunakan sesi!
dashesy
Terima kasih! Bagus, solusi elegan, mirip dengan scplebih sshdi Linux ... tidak perlu repot-repot dengan saham sial!
Tobias J
40

Gunakan net useatau New-PSDriveuntuk membuat drive baru:

New-PsDrive: buat PsDrive baru yang hanya terlihat di lingkungan PowerShell:

New-PSDrive -Name Y -PSProvider filesystem -Root \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

Penggunaan bersih: buat drive baru yang terlihat di semua bagian OS.

Net use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy
JPBlanc
sumber
Jika saya menjalankan ini dua kali saya mendapatkan New-PSDrive : A specified logon session does not exist. It may already have been terminated-> Saya pikir sesi sebelumnya masih berlangsung -> Jadi saya mencoba menggunakan Remove-PSDrive-> tetap tidak berhasil. Juga net use <driveLetter> /deletetidak membantu. Hal lain yang dapat saya lakukan agar saya dapat menjalankan perintah ini dalam konfigurasi pembuatan perangkat lunak?
Bruno Bieri
Tidak ada gunanya menjalankan New-PSDrivedua kali yang seharusnya Anda lakukanA drive with the name 'Y' already exists.
JPBlanc
Saya setuju bahwa tidak masuk akal untuk menjalankannya dua kali. Tapi itu dimasukkan ke dalam langkah pembuatan dan pembangunan tersebut berjalan beberapa kali sehari. Jadi pendekatan saya adalah menghapus drive setelah saya melakukan pekerjaan yang saya butuhkan dan saya berasumsi bahwa tidak ada masalah untuk membuatnya kembali begitu eksekusi build baru terjadi. Tapi sepertinya ada masalah. Ada petunjuk lain?
Bruno Bieri
Bagaimana dengan pengujian jika sudah dipasang sebelum memasangnya? atau Anda dapat menggunakan Remove-PSDrive di skrip Anda saat Anda yakin bahwa semua pegangan yang menggunakan jalur ini ditutup.
JPBlanc
16

Seandainya file jarak jauh memerlukan kredensial Anda untuk dapat diakses, Anda dapat membuat objek System.Net.WebClient menggunakan cmdlet New-Object untuk "Menyalin File dari Jarak Jauh", seperti itu

$Source = "\\192.168.x.x\somefile.txt"
$Dest   = "C:\Users\user\somefile.txt"
$Username = "username"
$Password = "password"

$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)

$WebClient.DownloadFile($Source, $Dest)

Atau jika Anda perlu mengupload file, Anda dapat menggunakan UploadFile:

$Dest = "\\192.168.x.x\somefile.txt"
$Source   = "C:\Users\user\somefile.txt"

$WebClient.UploadFile($Dest, $Source)
shyan1
sumber
1
@klm_ Bisakah Anda menjelaskan apa yang Anda maksud?
FastTrack
0

Tak satu pun dari jawaban di atas berhasil untuk saya. Saya terus mendapatkan kesalahan ini:

Copy-Item : Access is denied
+ CategoryInfo          : PermissionDenied: (\\192.168.1.100\Shared\test.txt:String) [Copy-Item], UnauthorizedAccessException>   
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand

Jadi ini berhasil untuk saya:

netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes

Kemudian dari host saya mesin saya di kotak Run saya baru saja melakukan ini:

\\{IP address of nanoserver}\C$
RogerW
sumber
1
Kemungkinan Anda mengalami masalah dengan izin berbagi + sistem file. Ingatlah bahwa izin yang paling ketat menang, jadi meskipun Anda memiliki akses di lapisan sistem file NTFS, jika izin berbagi membatasi Anda, maka Anda tidak akan dapat menulis. :)
Trevor Sullivan