Saat menyambung ke jaringan berbagi yang untuknya pengguna saat ini (dalam kasus saya, pengguna layanan yang diaktifkan jaringan) tidak memiliki hak, nama dan kata sandi harus disediakan.
Saya tahu bagaimana melakukan ini dengan fungsi Win32 ( WNet*
berasal dari keluarga mpr.dll
), tetapi ingin melakukannya dengan fungsionalitas .Net (2.0).
Opsi apa yang tersedia?
Mungkin beberapa informasi membantu:
- Case use adalah layanan windows, bukan aplikasi Asp.Net.
- Layanan berjalan di bawah akun yang tidak memiliki hak untuk berbagi.
- Akun pengguna yang dibutuhkan untuk pembagian tidak diketahui di sisi klien.
- Klien dan server bukan anggota dari domain yang sama.
Jawaban:
Anda dapat mengubah identitas utas, atau P / Invoke WNetAddConnection2. Saya lebih suka yang terakhir, karena kadang-kadang saya perlu mempertahankan beberapa kredensial untuk lokasi yang berbeda. Saya membungkusnya menjadi IDisposable dan memanggil WNetCancelConnection2 untuk menghapus kredit setelahnya (menghindari kesalahan beberapa nama pengguna):
sumber
Saya sangat menyukai jawaban Mark Brackett sehingga saya melakukan implementasi cepat saya sendiri. Ini dia jika ada orang lain yang membutuhkannya dengan tergesa-gesa:
sumber
throw new Win32Exception(result);
, karena WNetAddConnection2 mengembalikan kode kesalahan win32 (ERROR_XXX
)NetworkCredential
objek aplikasi dapat terhubung satu kali ke drive jaringan. Setelah itu kami mendapat ERROR_LOGON_FAILURE pada setiap upaya hingga aplikasi dimulai ulang. Kami kemudian mencoba untuk memasok domain padaNetworkCredential
objek juga, dan tiba-tiba berhasil! Saya tidak tahu mengapa ini memperbaiki masalah, terutama fakta bahwa itu berfungsi untuk terhubung sekali tanpa domain.Hari ini 7 tahun kemudian saya menghadapi masalah yang sama dan saya ingin membagikan versi solusinya.
Sudah siap salin & tempel :-) Ini dia:
Langkah 1
Dalam kode Anda (setiap kali Anda perlu melakukan sesuatu dengan izin)
Langkah 2
File Helper yang melakukan sihir
sumber
Saya mencari banyak metode dan saya melakukannya dengan cara saya sendiri. Anda harus membuka koneksi antara dua mesin melalui command prompt perintah NET USE dan setelah menyelesaikan pekerjaan Anda menghapus koneksi dengan command prompt NET USE "myconnection" / delete.
Anda harus menggunakan proses Command Prompt dari kode di belakang seperti ini:
Penggunaannya sederhana:
Berikut ini fungsinya:
Dan juga fungsi ExecuteCommand adalah:
Fungsi ini bekerja sangat cepat dan stabil untuk saya.
sumber
Solusi Luke Quinane terlihat bagus, tetapi hanya berfungsi sebagian dalam aplikasi ASP.NET MVC saya. Memiliki dua saham di server yang sama dengan kredensial berbeda, saya bisa menggunakan peniruan hanya untuk yang pertama.
Masalah dengan WNetAddConnection2 juga berperilaku berbeda pada versi windows yang berbeda. Itu sebabnya saya mencari alternatif dan menemukan fungsi LogonUser . Berikut adalah kode saya yang juga berfungsi di ASP.NET:
Pemakaian:
sumber
Untuk VB.lovers, VB.NET setara dengan kode Luke Quinane (terima kasih Luke!)
sumber
Salah satu opsi yang mungkin berfungsi adalah menggunakan
WindowsIdentity.Impersonate
(dan mengubah utas utas) untuk menjadi pengguna yang diinginkan, seperti itu . Kembali ke p / memohon, aku takut ...Opsi nakal lainnya (dan sama-sama jauh dari ideal) mungkin untuk menelurkan proses untuk melakukan pekerjaan ...
ProcessStartInfo
menerima.UserName
,.Password
dan.Domain
.Akhirnya - mungkin menjalankan layanan di akun khusus yang memiliki akses?(dihapus karena Anda telah mengklarifikasi bahwa ini bukan pilihan).sumber
OKE ... Saya bisa resond ..
Penafian: Saya baru saja 18+ jam sehari (lagi) .. Saya sudah tua dan pelupa .. Saya tidak bisa mengeja .. Saya memiliki rentang perhatian yang pendek jadi saya lebih baik merespons dengan cepat .. :-)
Pertanyaan:
Apakah mungkin untuk mengubah pokok utas menjadi pengguna tanpa akun di mesin lokal?
Menjawab:
Ya, Anda dapat mengubah prinsip utas meskipun kredensial yang Anda gunakan tidak didefinisikan secara lokal atau di luar "hutan".
Saya baru saja mengalami masalah ini ketika mencoba terhubung ke server SQL dengan otentikasi NTLM dari layanan. Panggilan ini menggunakan kredensial yang terkait dengan proses yang berarti bahwa Anda memerlukan akun lokal atau akun domain untuk mengautentikasi sebelum Anda dapat berkedok sebagai. Blah, blah ...
Tapi...
Memanggil LogonUser (..) dengan atribut ???? _ NEW_CREDENTIALS akan mengembalikan token keamanan tanpa mencoba mengotentikasi kredensial. Kewl .. Tidak harus mendefinisikan akun di dalam "hutan". Setelah Anda memiliki token, Anda mungkin harus memanggil DuplicateToken () dengan opsi untuk mengaktifkan peniruan yang menghasilkan token baru. Sekarang panggil SetThreadToken (NULL, token); (Mungkin & token?) .. Panggilan ke ImpersonateLoggedonUser (token); mungkin diperlukan, tapi saya rasa tidak. Lihat itu ..
Lakukan apa yang perlu Anda lakukan ..
Panggil RevertToSelf () jika Anda memanggil ImpersonateLoggedonUser () lalu SetThreadToken (NULL, NULL); (Saya pikir ... lihat itu), dan kemudian CloseHandle () pada gagang yang dibuat ..
Tidak ada janji tapi ini berhasil untuk saya ... Ini di atas kepala saya (seperti rambut saya) dan saya tidak bisa mengeja !!!
sumber
Jika Anda tidak dapat membuat token keamanan yang valid secara lokal, sepertinya Anda telah mengesampingkan semua bilah opsi API Win32 dan WNetAddConnection *.
Banyak informasi di MSDN tentang informasi WNet - PInvoke dan kode sampel yang terhubung ke jalur UNC di sini:
Referensi MSDN di sini:
sumber
Juga porting ke F # untuk digunakan dengan FAKE
sumber
Anda harus melihat menambahkan seperti ini:
Ke dalam web.config Anda.
Informasi Lebih Lanjut.
sumber