2012-04-17 27 views
20

Tôi có một dòng mã kiểm tra nếu một thư mục tồn tại và sau đó nhận được danh sách các tập tin trong đó.Directory.Exists không hoạt động cho đường dẫn mạng

System.IO.Directory.Exists(@"\\Server\Folder\"); 

Tôi làm việc khi thử nghiệm (chạy từ studio trực quan), nhưng khi triển khai trang web, nó luôn trả về false.

Tôi thực hiện xác minh tương tự cho một thư mục khác, trên máy chủ khác (giả sử Server2) và hoạt động tốt.

Sau đó tôi nghĩ đó là vấn đề truy cập, nhưng thư mục và mạng chia sẻ có tất cả quyền truy cập vào tất cả mọi người ... Có lý do nào khác khiến nó không hoạt động không?

+6

Liệu tài khoản mà IIS chạy dưới có quyền truy cập? – Matthew

+0

Có thể không tham chiếu đến 'Máy chủ' không? – David

Trả lời

15

Khi bạn chạy mã trong Visual Studio, nó chạy dưới quyền của người dùng của bạn.

Khi bạn chạy mã trong IIS nó chạy trong danh tính của hồ bơi ứng dụng theo mặc định là người dùng được tích hợp "Dịch vụ mạng", đây là tài khoản người dùng cục bộ không có quyền truy cập bên ngoài máy cục bộ.

Quyền trên mạng chia sẻ là lớp đầu tiên, sau đó các quyền NTFS trên thư mục được chọn.

Bạn cần thay đổi danh tính của nhóm ứng dụng thành người dùng miền có cùng quyền với người dùng của bạn.

+1

Nó cũng hoạt động trên IIS cục bộ của tôi để kiểm tra, nhưng cài đặt là cho người dùng Ứng dụng, vì vậy nó đã đưa người dùng cửa sổ cục bộ của tôi kết nối vào mạng. Tôi đặt người dùng cụ thể của tôi vào IIS của máy chủ chính thức và nó đã hoạt động. Cảm ơn. – Amaranth

3

Tôi có thể trễ một chút, nhưng tôi thấy rằng có sự cố về phương pháp này của lớp Directory. Thay vào đó tôi đã sử dụng DirectoryInfo với mạo danh theo cách này:

new DirectoryInfo(path).Exists 

Bằng cách này bạn tránh được những vấn đề thay đổi danh tính toàn bộ, mà đã bị từ chối bởi khu vực CNTT của chúng tôi.

Tôi hy vọng điều này sẽ giúp ai đó!

+0

Điều này không giải quyết được vấn đề mạo danh. Sự khác biệt chính là 'Directory' là một lớp tĩnh và' DirectoryInfo' là một thể hiện của một lớp. –

1

Đối với tài liệu tham khảo trong tương lai, điều này cũng làm việc:

bool result = false; 
try 
{ 
    Directory.GetAccessControl(path); 
    result = true; 
} 
catch (UnauthorizedAccessException) 
{ 
    result = true; 
} 
catch 
{ 
    result = false; 
} 
Các vấn đề liên quan