2012-01-12 31 views
7

Trong .NET, có cách đơn giản để kiểm tra xem người dùng hiện tại có quyền truy cập để tạo tệp trong thư mục không? Một cái gì đó tương đương với hàm C++ _access, sẽ là lý tưởng.Trong .NET, hãy kiểm tra xem người dùng hiện tại có thể ghi vào thư mục

Tôi không muốn sử dụng bản dùng thử và lỗi (tạo tệp giả và sau đó xóa tệp): ngoài việc có vẻ bị tấn công, phần mềm khác đang theo dõi thư mục được đề cập cho các tệp bị xóa.

Tôi không muốn sử dụng System.DirectoryServices: xem xét ACL, giải quyết tư cách thành viên nhóm và cách quyền từ các thành viên nhóm khác nhau tương tác dường như dễ bị lỗi và quá khó. Phải có một chức năng vâng hoặc ở đâu đó, phải không?

Cảm ơn trước!

[sửa] làm tiền thưởng, nếu nó cũng hoạt động với một mạng chia sẻ, điều đó sẽ rất tuyệt.

+1

http://stackoverflow.com/a/265958/284240 Do đó xử lý Ngoại lệ. –

+0

bản sao có thể có của [Cách kiểm tra xem tôi có thể tạo tệp trong một thư mục cụ thể trong C#?] (Http://stackoverflow.com/questions/316903/how-to-check-if-i-can-create-a -file-in-a-specific-folder-in-c) – Joe

+0

kiểm tra câu trả lời này, để chuyển đổi nó trong VB.NET nên là tầm thường ;-) http://stackoverflow.com/a/130641/559144 –

Trả lời

5
FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename); 
if (SecurityManager.IsGranted(writePermission)){ 
    //write here 
} else { 
    //some error message 
} 
+0

Giả sử nó hoạt động (tôi hy vọng), một trong những câu trả lời đó làm cho tôi upvote, upvote câu hỏi, và yêu thích nó :) –

+0

Trông tuyệt vời! Hãy để tôi thử. –

+1

Nó dường như không làm việc cho tôi. Đối với một số lý do nó luôn luôn trở lại đúng sự thật. Nó phải là một cái gì đó tôi đang làm sai, nhưng nó là như vậy thẳng về phía trước, tôi không nhìn thấy những gì nó sẽ được./sigh ... Tôi đã đánh dấu nó là đã được chấp nhận, bởi vì nó chỉ tôi đến đúng API. Tôi chỉ cần phải làm việc nó ra, tôi đoán –

0

Sau đây sẽ trở lại một trường hợp DirecotrySecurity http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.directorysecurity.aspx

DirectoryInfo(pathstr).GetAccessControl() 
+1

Điều này có áp dụng cho người dùng hiện tại không? Tôi đã xem xét điều này và dường như nó cung cấp quyền truy cập vào ACL.Có thể nói rằng nhóm người dùng "Người quản lý Foo" có quyền truy cập ghi và "Người lao động thanh" bị từ chối nhưng không giúp tôi giải quyết xem người dùng hiện tại có phải là thành viên của nhóm là thành viên của một trong các nhóm này hay không. Có lẽ tôi nhớ cách giải quyết bit đó –

5

Kiểm tra sự cho phép trước là một dự án dicey. Không phải đề cập đến phức tạp, chạy qua toàn bộ danh sách ACL và tính toán thiết lập quyền hiệu quả.

Hơn nữa ... không có đảm bảo nào. Chỉ vì bạn chủ động kiểm tra quyền trước thời hạn không có nghĩa là các quyền sẽ không thay đổi tại thời điểm bạn cố gắng tạo tệp.

Cách "đúng" là thực hiện security demand, hoặc tuyên bố với FileIOPermissionAttribute hoặc bắt buộc bằng cách tạo một phiên bản FileIOPermission thích hợp và gọi phương thức Demand() của nó. Nếu bạn có quyền mong muốn, cuộc gọi đến Demand() sẽ thành công; nếu không, nó sẽ ném một số SecurityException, mà bạn sẽ cần phải nắm bắt và hành động.

Theo kinh nghiệm của tôi, kiểm tra bắt buộc dễ dàng hơn. Cũng cần lưu ý rằng trong Windows 7, trong khi bạn có thể có quyền ghi vào thư mục, nó vẫn có thể không hoạt động trừ khi bạn đang chạy với quyền cao.

+0

Tôi đồng ý hoàn toàn. Tôi sẽ không muốn kiểm tra quyền để bảo vệ một hoạt động có thể thất bại. Chúng tôi có một hệ thống di sản có nhiều phần mềm chạy trên nhiều máy chủ và bị chặn bởi các vấn đề về quản trị/cấu hình. Tôi cần phải viết một ứng dụng mà đi qua tìm kiếm các lỗi cấu hình, nhưng phải làm như vậy thụ động, không có cơ hội của các tập tin thử nghiệm mồ côi/giả hoặc tương tự. –

Các vấn đề liên quan