Kami mengalami situasi yang menarik yang perlu diselesaikan, dan pencarian saya telah muncul sampai nol. Karena itu saya meminta bantuan komunitas SO.
Masalahnya adalah ini: kami memiliki kebutuhan untuk secara terprogram mengakses file bersama yang tidak ada dalam domain kami, dan tidak berada dalam domain eksternal tepercaya melalui file sharing jarak jauh / UNC. Secara alami, kita perlu memasok kredensial ke mesin jarak jauh.
Biasanya, seseorang memecahkan masalah ini dengan satu dari dua cara:
- Petakan berbagi file sebagai drive dan berikan kredensial pada saat itu. Ini biasanya dilakukan dengan menggunakan
NET USE
perintah atau fungsi Win32 yang menduplikasiNET USE
. - Akses file dengan jalur UNC seolah-olah komputer jarak jauh berada di domain dan pastikan bahwa akun yang menjalankan program digandakan (termasuk kata sandi) pada mesin jarak jauh sebagai pengguna lokal. Pada dasarnya memanfaatkan fakta bahwa Windows akan secara otomatis menyediakan kredensial pengguna saat ini ketika pengguna mencoba mengakses file bersama.
- Jangan gunakan berbagi file jarak jauh. Gunakan FTP (atau cara lain) untuk mentransfer file, mengerjakannya secara lokal, lalu mentransfernya kembali.
Karena berbagai alasan, arsitek keamanan / jaringan kami telah menolak dua pendekatan pertama. Pendekatan kedua jelas merupakan lubang keamanan; jika komputer jarak jauh terganggu, komputer lokal sekarang berisiko. Pendekatan pertama tidak memuaskan karena drive yang baru dipasang adalah sumber daya bersama yang tersedia untuk program lain di komputer lokal selama akses file oleh program. Meskipun sangat mungkin untuk membuat ini sementara, itu masih menjadi lubang dalam pendapat mereka.
Mereka terbuka untuk opsi ketiga, tetapi admin jaringan jauh bersikeras SFTP daripada FTPS, dan FtpWebRequest hanya mendukung FTPS. SFTP adalah opsi yang lebih ramah-firewall dan ada beberapa perpustakaan yang bisa saya gunakan untuk pendekatan itu, tetapi saya lebih suka mengurangi ketergantungan saya jika saya bisa.
Saya telah mencari MSDN untuk dikelola atau win32 cara menggunakan berbagi file jarak jauh, tapi saya gagal menemukan sesuatu yang berguna.
Jadi saya bertanya: Apakah ada cara lain? Apakah saya melewatkan fungsi win32 rahasia super yang melakukan apa yang saya inginkan? Atau haruskah saya mengejar beberapa varian opsi 3?
sumber
Jawaban:
Cara untuk memecahkan masalah Anda adalah dengan menggunakan Win32 API yang disebut WNetUseConnection .
Gunakan fungsi ini untuk terhubung ke jalur UNC dengan otentikasi, BUKAN untuk memetakan drive .
Ini akan memungkinkan Anda untuk terhubung ke mesin jarak jauh, bahkan jika itu tidak pada domain yang sama, dan bahkan jika itu memiliki nama pengguna dan kata sandi yang berbeda.
Setelah Anda menggunakan WNetUseConnection Anda akan dapat mengakses file melalui jalur UNC seolah-olah Anda berada di domain yang sama. Cara terbaik mungkin melalui administrasi yang dibangun di saham.
Contoh: \\ computername \ c $ \ program file \ Folder \ file.txt
Berikut adalah beberapa contoh kode C # yang menggunakan WNetUseConnection.
Catatan, untuk NetResource, Anda harus memberikan null untuk lpLocalName dan lpProvider. Tipe dwType harus RESOURCETYPE_DISK. LpRemoteName harus \\ ComputerName.
sumber
WNetUseConnection
ditutup secara manual dengan meneleponWNetCancelConnection2
? Atau apakah ada batas waktu idle (atau mekanisme lain) dan kita tidak perlu repot?Untuk orang yang mencari solusi cepat, Anda dapat menggunakan
NetworkShareAccesser
saya menulis baru-baru ini (berdasarkan jawaban ini (terima kasih banyak!)):Pemakaian:
PERINGATAN: Silakan membuat benar-benar yakin, bahwa
Dispose
dariNetworkShareAccesser
disebut (bahkan jika Anda app crash!), Jika tidak sambungan terbuka akan tetap pada Windows. Anda dapat melihat semua koneksi terbuka dengan membukacmd
prompt dan masuknet use
.Kode:
sumber
using System.Runtime.InteropServices;
danusing System.ComponentModel;
untukDllImport
danWin32Exception
AFAIK, Anda tidak perlu memetakan jalur UNC ke huruf drive untuk membuat kredensial untuk server. Saya secara teratur menggunakan skrip batch seperti:
Namun, semua program yang berjalan pada akun yang sama dengan program Anda masih dapat mengakses semua yang
username:password
memiliki akses. Solusi yang mungkin bisa dilakukan dengan mengisolasi program Anda di akun pengguna lokalnya sendiri (akses UNC bersifat lokal ke akun yang dipanggilNET USE
).Catatan: Menggunakan domain lintas SMB tidak cukup baik menggunakan teknologi, IMO. Jika keamanan itu penting, fakta bahwa SMB tidak memiliki enkripsi sedikit mereda dengan sendirinya.
sumber
NET USE
, itu mungkin pendekatan yang layak. Apakah Anda yakin kami perlu menggunakan akun lokal? BukankahNET USE
panggilan itu bersifat lokal ke mesin yang dipanggil? Anda telah memberi saya jalur penelitian yang bagusDaripada WNetUseConnection, saya akan merekomendasikan NetUseAdd . WNetUseConnection adalah fungsi lawas yang telah digantikan oleh WNetUseConnection2 dan WNetUseConnection3, tetapi semua fungsi tersebut menciptakan perangkat jaringan yang terlihat di Windows Explorer. NetUseAdd adalah setara dengan memanggil penggunaan bersih dalam prompt DOS untuk mengotentikasi pada komputer jarak jauh.
Jika Anda memanggil NetUseAdd maka upaya selanjutnya untuk mengakses direktori harus berhasil.
sumber
Walaupun saya sendiri tidak tahu, saya tentu berharap bahwa # 2 tidak benar ... Saya ingin berpikir bahwa Windows tidak akan secara OTOMATIS memberikan informasi login saya (apalagi kata sandi saya!) Ke mesin apa pun , apalagi yang bukan bagian dari kepercayaan saya.
Bagaimanapun juga, sudahkah Anda menjelajahi arsitektur peniruan? Kode Anda akan terlihat mirip dengan ini:
Dalam hal ini,
token
variabelnya adalah IntPtr. Untuk mendapatkan nilai untuk variabel ini, Anda harus memanggil fungsi LogonUser Windows API yang tidak dikelola. Perjalanan singkat ke pinvoke.net memberi kami tanda tangan berikut:Nama pengguna, domain, dan kata sandi seharusnya terlihat cukup jelas. Lihat berbagai nilai yang dapat dikirimkan ke dwLogonType dan dwLogonProvider untuk menentukan nilai yang paling sesuai dengan kebutuhan Anda.
Kode ini belum diuji, karena saya tidak memiliki domain kedua di sini tempat saya dapat memverifikasi, tetapi semoga ini menempatkan Anda di jalur yang benar.
sumber
Di sini kelas POC minimal dg semua cruft dihapus
Anda dapat langsung menggunakan
\\server\share\folder
dgWNetUseConnection
, tidak perlu melepasnya hanya untuk\\server
bagian sebelumnya.sumber
Sebagian besar server SFTP mendukung SCP juga yang bisa menjadi jauh lebih mudah untuk menemukan perpustakaan. Anda bahkan bisa memanggil klien yang sudah ada dari kode Anda seperti pscp yang disertakan dengan Putty .
Jika jenis file yang Anda kerjakan adalah sesuatu yang sederhana seperti teks atau file XML, Anda bahkan dapat menulis implementasi klien / server Anda sendiri untuk memanipulasi file menggunakan sesuatu seperti .NET Remoting atau layanan web.
sumber
Saya telah melihat opsi 3 diimplementasikan dengan alat JScape dengan cara yang sangat mudah. Anda mungkin mencobanya. Ini tidak gratis, tetapi ini berfungsi dengan baik.
sumber
saya lampirkan kode vb.net saya berdasarkan referensi brian
bagaimana cara menggunakannya
sumber
Saya mencari MS untuk menemukan jawabannya. Solusi pertama mengasumsikan akun pengguna yang menjalankan proses aplikasi memiliki akses ke folder atau drive bersama (Domain yang sama). Pastikan DNS Anda teratasi atau coba gunakan alamat IP. Cukup lakukan hal berikut:
Jika Anda ingin melintasi berbagai domain .NET 2.0 dengan kredensial, ikuti model ini:
sumber