Saya perlu menguji apakah pengguna dapat menulis ke folder sebelum benar-benar mencoba melakukannya.
Saya telah menerapkan metode berikut (dalam C # 2.0) yang mencoba untuk mengambil izin keamanan untuk folder menggunakan metode Directory.GetAccessControl () .
private bool hasWriteAccessToFolder(string folderPath)
{
try
{
// Attempt to get a list of security permissions from the folder.
// This will raise an exception if the path is read only or do not have access to view the permissions.
System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
return true;
}
catch (UnauthorizedAccessException)
{
return false;
}
}
Ketika saya googling cara menguji akses tulis, tidak ada yang seperti ini muncul dan tampaknya sangat rumit untuk benar-benar menguji izin di Windows. Saya khawatir bahwa saya terlalu menyederhanakan hal-hal dan bahwa metode ini tidak kuat, meskipun tampaknya berhasil.
Apakah metode saya untuk menguji apakah pengguna saat ini memiliki akses tulis berfungsi dengan benar?
c#
permissions
directory
Chris B
sumber
sumber
Jawaban:
Itu cara yang sangat valid untuk memeriksa akses folder di C #. Satu-satunya tempat yang mungkin jatuh adalah jika Anda perlu menyebutnya dalam loop ketat di mana overhead pengecualian mungkin menjadi masalah.
Ada beberapa pertanyaan serupa yang diajukan sebelumnya.
sumber
Saya menghargai bahwa ini sedikit terlambat untuk posting ini, tetapi Anda mungkin menemukan sedikit kode ini berguna.
Masukkan itu ke dalam aplikasi Konsol dan lihat apakah itu sesuai dengan yang Anda butuhkan.
sumber
GetAccessControl
tetapi perangkat lunak saya sebenarnya mampu menulis ke direktori yang saya cari ..?sumber
string tempFileName = Path.GetRandomFileName();
jelasSaya mencoba sebagian besar dari ini, tetapi mereka memberikan positif palsu, semua untuk alasan yang sama .. Tidak cukup untuk menguji direktori untuk izin yang tersedia, Anda harus memeriksa bahwa pengguna yang masuk adalah anggota grup yang memiliki izin. Untuk melakukan ini, Anda mendapatkan identitas pengguna, dan memeriksa apakah itu adalah anggota grup yang berisi FileSystemAccessRule IdentityReference. Saya telah menguji ini, bekerja dengan sempurna ..
sumber
(AccessRight & rule.FileSystemRights) > 0
penolakan haruslah karena setiap jenis akses sub ditolak yang merupakan bagian dariAccessRight
cara Anda tidak memiliki penuh akses keAccessRight
IMHO satu-satunya cara yang dapat diandalkan 100% untuk menguji apakah Anda dapat menulis ke direktori adalah dengan benar-benar menulis dan akhirnya menangkap pengecualian.
sumber
Sebagai contoh untuk semua pengguna (Pengguna Builtin \), metode ini berfungsi dengan baik - selamat menikmati.
sumber
Coba ini:
sumber
fsAccessRule.AccessControlType
bisa terjadiAccessControlType.Deny
.Kode Anda mendapatkan
DirectorySecurity
untuk direktori yang diberikan, dan menangani pengecualian (karena Anda tidak memiliki akses ke informasi keamanan) dengan benar. Namun, dalam sampel Anda, Anda tidak benar-benar menginterogasi objek yang dikembalikan untuk melihat akses apa yang diizinkan - dan saya pikir Anda perlu menambahkan ini.sumber
Berikut adalah versi modifikasi dari jawaban CsabaS , yang menjelaskan aturan akses penolakan eksplisit. Fungsi melewati semua FileSystemAccessRules untuk direktori, dan memeriksa apakah pengguna saat ini dalam peran yang memiliki akses ke direktori. Jika tidak ada peran yang ditemukan atau pengguna dalam peran dengan akses ditolak, fungsi mengembalikan false. Untuk memeriksa hak baca, operasikan FileSystemRights.Baca ke fungsi; untuk hak menulis, lewati FileSystemRights.Write. Jika Anda ingin memeriksa hak pengguna yang arbitrer dan bukan hak yang sekarang, gantilah WindowsIdentity Pengguna saat ini dengan WindowsIdentity yang diinginkan. Saya juga menyarankan agar tidak mengandalkan fungsi seperti ini untuk menentukan apakah pengguna dapat menggunakan direktori dengan aman. Jawaban ini dengan sempurna menjelaskan alasannya.
sumber
Solusi di atas baik tetapi bagi saya, saya menemukan kode ini sederhana dan bisa diterapkan. Cukup buat file sementara. Jika file dibuat, berarti pengguna memiliki akses tulis.
sumber
Create
izin tetapi tidakDelete
dalam hal ini akan kembali salah meskipun pengguna memang memiliki izin menulis.Path.Combine
sebagai gantinyaPath.Combine(tempfilepath, "temp.txt")
.Anda dapat mencoba blok kode berikut untuk memeriksa apakah direktori tersebut memiliki akses tulis. Itu memeriksa FileSystemAccessRule.
sumber
Anda memiliki potensi kondisi ras dalam kode Anda - apa yang terjadi jika pengguna memiliki izin untuk menulis ke folder ketika Anda memeriksa, tetapi sebelum pengguna benar-benar menulis ke folder izin ini ditarik? Tulisan akan melempar pengecualian yang perlu Anda tangkap dan tangani. Jadi pemeriksaan awal tidak ada gunanya. Anda sebaiknya menulis dan menangani segala pengecualian. Ini adalah pola standar untuk situasi Anda.
sumber
http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Kelas yang sangat berguna, periksa versi yang disempurnakan dalam pesan di bawah.
sumber
Hanya mencoba mengakses file yang dipermasalahkan belum cukup. Tes akan berjalan dengan izin pengguna yang menjalankan program - Yang belum tentu izin pengguna yang ingin Anda uji terhadap.
sumber
Saya setuju dengan Ash, itu seharusnya baik-baik saja. Atau Anda dapat menggunakan CAS deklaratif dan benar-benar mencegah program berjalan di tempat pertama jika mereka tidak memiliki akses.
Saya percaya beberapa fitur CAS mungkin tidak hadir di C # 4.0 dari apa yang saya dengar, tidak yakin apakah itu mungkin masalah atau tidak.
sumber
Saya tidak bisa mendapatkan GetAccessControl () untuk melempar pengecualian pada Windows 7 seperti yang direkomendasikan dalam jawaban yang diterima.
Saya akhirnya menggunakan variasi jawaban sdds :
Semoga ini membantu.
sumber
Saya menghadapi masalah yang sama: cara memverifikasi jika saya bisa membaca / menulis di direktori tertentu. Saya berakhir dengan solusi mudah untuk ... benar-benar mengujinya. Inilah solusi sederhana namun efektif saya.
Semoga ini bisa membantu!
sumber
Sebagian besar jawaban di sini tidak memeriksa akses tulis. Itu hanya memeriksa apakah pengguna / grup dapat 'Baca Izin' (Baca daftar ACE dari file / direktori).
Juga melakukan iterasi melalui ACE dan memeriksa apakah cocok dengan Security Identifier tidak berfungsi karena pengguna dapat menjadi anggota grup yang darinya ia dapat / kehilangan hak istimewa. Lebih buruk dari itu adalah kelompok bersarang.
Saya tahu ini adalah utas lama tetapi ada cara yang lebih baik bagi siapa pun yang melihatnya sekarang.
Asalkan pengguna memiliki hak Baca Izin adalah, seseorang dapat menggunakan API Authz untuk memeriksa akses Efektif.
https://docs.microsoft.com/en-us/windows/win32/secauthz/using-authz-api
https://docs.microsoft.com/en-us/windows/win32/secauthz/checking-access-with-authz-api
sumber