2009-01-16 22 views
6

Tôi có một mã tạo tệp trong thư mục do người dùng chỉ định. Người dùng có thể trỏ đến một thư mục mà trong đó anh ta không thể tạo tệp, nhưng anh ta có thể đổi tên nó.Làm thế nào để kiểm tra xem một tập tin có thể được tạo bên trong thư mục nhất định trên MS XP/Vista không?

Tôi đã tạo thư mục cho mục đích thử nghiệm, hãy gọi nó là C:\foo.

Tôi đã điều khoản sau đây để C:\foo:

  • Vượt qua thư mục/Execute tập tin
  • Loại bỏ các thư mục con và các tập tin
  • Loại bỏ
  • đọc quyền
  • quyền Change
  • Chiếm quyền sở hữu

tôi không có bất cứ quyền sau đây để C:\foo:

  • Full Control
  • tạo file
  • tạo thư mục

Tôi đã thử phương pháp sau đây, cho đến nay:


os.access('C:\foo', os.W_OK) == True

st = os.stat('C:\foo')
mode = st[stat.ST_MODE]
mode & stat.S_IWRITE == True

Tôi tin rằng điều này là do thực tế là tôi có thể đổi tên thư mục, vì vậy nó có thể thay đổi đối với tôi. Nhưng đó là nội dung - không.

Có ai biết làm thế nào tôi có thể viết mã sẽ kiểm tra một thư mục nhất định nếu người dùng hiện tại có quyền tạo tệp trong thư mục đó không?

Tóm tắt - Tôi muốn kiểm tra xem người dùng hiện tại có Tạo tệptạo thư mục quyền đối với tên thư mục đã cho không.

EDIT: Sự cần thiết của mã như vậy phát sinh từ các trường hợp thử nghiệm không có 3 từ 'chứng nhận cho Windows Vista' chương trình, trong đó nêu:

  1. Ứng dụng này không phải cho phép người dùng Least-Privileged để tiết kiệm bất kỳ tệp nào vào thư mục Hệ thống Windows để vượt qua trường hợp thử nghiệm này.

Điều này có nên được hiểu là 'Ứng dụng có thể tìm cách lưu tệp trong thư mục Hệ thống Windows nhưng không bị lỗi khi không thành công?' hay đúng hơn 'Ứng dụng phải thực hiện kiểm tra bảo mật trước khi thử lưu tệp?'

Tôi có nên ngừng làm phiền chỉ vì bản thân Windows Vista sẽ không cho phép người dùng ít quyền ưu tiên lưu bất kỳ tệp nào trong% WINDIR%?

Trả lời

4

Gần đây tôi đã viết một ứng dụng để vượt qua một bộ kiểm tra để có được trạng thái ISV từ Microsoft và tôi cũng thêm điều kiện đó. Cách tôi hiểu nó là nếu người dùng là Ít nhất Priveledge sau đó ông sẽ không có quyền để viết trong các thư mục hệ thống. Vì vậy, tôi đã tiếp cận vấn đề theo cách mà Ishmaeel đã mô tả. Tôi cố gắng để tạo ra các tập tin và bắt ngoại lệ sau đó thông báo cho người dùng rằng ông không có quyền để ghi các tập tin vào thư mục đó.

Trong sự hiểu biết của tôi, người dùng ít quyền nhất sẽ không có quyền cần thiết để ghi vào các thư mục đó, nếu người đó có thì người đó không phải là người dùng ít quyền riêng tư.

Tôi có nên ngừng làm phiền chỉ vì bản thân Windows Vista sẽ không cho phép người dùng ít quyền ưu tiên lưu bất kỳ tệp nào trong% WINDIR%?

Theo ý kiến ​​của tôi? Vâng.

+0

Cảm ơn bạn. Tôi sẽ làm theo lời khuyên của bạn và Ishmaeels. – Abgan

4

Tôi sẽ không lãng phí thời gian và LOC vào việc kiểm tra quyền. Kiểm thử cuối cùng của việc tạo tập tin trong Windows là bản thân sự sáng tạo. Các yếu tố khác có thể phát sinh (chẳng hạn như các tệp hiện có (hoặc tệ hơn, các thư mục) có cùng tên, không gian đĩa, các quy trình nền.Những điều kiện này thậm chí có thể thay đổi giữa thời gian bạn thực hiện kiểm tra ban đầu và thời gian bạn thực sự cố gắng tạo tệp của mình. Vì vậy, nếu tôi có kịch bản như vậy, tôi sẽ chỉ thiết kế phương pháp của mình để không mất bất kỳ dữ liệu nào trong trường hợp không thành công, hãy tiếp tục và thử tạo tệp của tôi, và cung cấp cho người dùng tùy chọn thay đổi lựa chọn và thử lại nếu quá trình tạo không thành công.

+0

Ứng dụng hiện tại không gặp sự cố như vậy, chỉ hiển thị cửa sổ bật lên hoạt động đó không thành công. Nhưng những gì tôi thực sự cần là vượt qua bài kiểm tra 'Chứng nhận cho Windows Vista' - xem câu hỏi đã chỉnh sửa. – Abgan

+0

Tôi tin rằng trường hợp thử nghiệm có nghĩa là ứng dụng không được chứa lỗ hổng cấp phép hoặc cố gắng phá vỡ bảo mật tiêu chuẩn để cho phép hoạt động được cho biết. Ngoài ra, bảo mật thư mục phải là trách nhiệm của hệ điều hành. – Ishmaeel

3

Tôi đồng ý với các câu trả lời khác là cách để thực hiện việc này là cố gắng tạo tệp và bắt ngoại lệ.

Tuy nhiên, trên Vista hãy coi chừng UAC! Xem ví dụ "Why does my application allow me to save files to the Windows and System32 folders in Vista?": Để hỗ trợ các ứng dụng cũ, Vista sẽ "giả vờ" để tạo tệp trong khi thực tế nó tạo ra nó trong Cửa hàng ảo dưới cấu hình của người dùng hiện tại.

Để tránh điều này, bạn phải thông báo cụ thể cho Vista rằng bạn không muốn đặc quyền quản trị, bằng cách đưa các lệnh thích hợp vào tệp kê khai .exe, hãy xem câu hỏi được liên kết ở trên.

+0

Cảm ơn bạn đã cảnh báo, nhưng ứng dụng được đề cập đã yêu cầu mức độ thực hiện được đặt thành 'asInvoker', vì vậy tôi không nên truy cập vào UAC :-) – Abgan

3
import os 
import tempfile 

def can_create_file(folder_path): 
    try: 
     tempfile.TemporaryFile(dir=folder_path) 
     return True 
    except OSError: 
     return False 

def can_create_folder(folder_path): 
    try: 
     name = tempfile.mkdtemp(dir=folder_path) 
     os.rmdir(name) 
     return True 
    except OSError: 
     return False 
+0

Bạn can_create_folder() không thành công nếu người dùng không có quyền xóa thư mục, nhưng có quyền tạo ra nó. Và bạn không nên bắt IOError thay vì OSError? Tôi nhận được IOError với errno: 13. Nếu không thì tốt, nhưng tôi phải bắt IOError khi tạo tập tin thực tế anyway (điều kiện chủng tộc). – Abgan

+0

Lưu ý rằng Python 3.3 tăng PermissionError. Vì vậy, bạn nên kiểm tra nó một lần để xem loại ngoại lệ nào mà nó tăng cho phiên bản Python của bạn. – Ecno92

+0

Tôi thường bắt 'EnvironmentError' là' IOError', 'OSError' và' WindowsError' đều được lấy từ nó –

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