2009-08-31 24 views
7

Tôi phát hiện ra một ứng dụng tôi đã viết không hoạt động đúng trong Windows Vista/7 nếu UAC được kích hoạt ở mọi cấp độ, vì nó ghi tệp vào thư mục cài đặt của chương trình, mặc định là "C: \ Program Files \ MyProgram." Nếu UAC bị vô hiệu hóa (hoặc trên bất kỳ phiên bản Windows nào khác) nó hoạt động đúng - tôi đọc UAC từ chối các ứng dụng ghi quyền truy cập vào thư mục Program Files theo mặc định.Cách đúng để thiết kế xung quanh giới hạn UAC của Windows?

Câu hỏi của tôi là, tôi nên viết ứng dụng của mình như thế nào để có thể sử dụng ứng dụng mà không cần bất kỳ "quyền" nào. Tôi không muốn người dùng phải chạy nó với đặc quyền nâng cao hoặc với tư cách là quản trị viên. Tôi chỉ muốn nó làm việc. Có những thư mục nào đó mà bất kỳ ứng dụng nào có quyền ghi vào UAC, nơi tốt hơn để ghi các tệp của tôi? Chúng chủ yếu là các tệp cấu hình được tạo/hủy/cập nhật động.

Cảm ơn sự giúp đỡ của bạn!

+3

Tôi sẽ không gọi các giới hạn "hạn chế" của UAC đối với đơn đăng ký của bạn. Về mặt kỹ thuật họ đang có, nhưng nhiều hơn hoặc ít hơn nó chỉ hướng dẫn bạn vào không làm điều gì đó bạn không bao giờ nên làm ở nơi đầu tiên –

+0

"không bao giờ nên làm" - tại sao không? – JimDaniel

+3

Tại sao bạn lại muốn ghi dữ liệu cấu hình vào Program Files? Đó là thư mục cài đặt. Đó là nơi thực thi và các thư viện đi. Dữ liệu không đến đó ... –

Trả lời

12

Dữ liệu cụ thể của ứng dụng cho mỗi người dùng phải được ghi trong thư mục AppData.

Bạn nên sử dụng SHGetKnownFolderPath với FOLDERID_LocalAppData.

Trong mã được quản lý, bạn nên sử dụng System.Environment.GetFolderPath với System.Environment.SpecialFolder.LocalApplicationData.

+2

Nếu bạn sử dụng khả năng cấu hình .NET (không gian tên 'System.Configuration', đây là các tệp .settings trong dự án C#), dữ liệu của bạn sẽ được đặt ở vị trí thích hợp và bạn sẽ có những cách rất thanh lịch để truy cập và cập nhật nó. –

4

Có, có các vị trí cụ thể. Hãy xem xét this msdn article làm tham chiếu đầu tiên. Nó đề cập đến các địa điểm:

  • CSIDL_APPDATA
  • CSIDL_LOCAL_APPDATA
  • CSIDL_COMMON_APPDATA

Trong mã nguồn gốc, phương pháp SHGetKnownFolderPath nên hữu ích.

Trong mã được quản lý, bạn có thể sử dụng Environment.GetFolderPath(). Nếu bạn đang ở trong một khung ứng dụng cụ thể, chẳng hạn như các hình thức cửa sổ, bạn có thể truy cập dễ dàng hơn thông qua các thuộc tính trực tiếp, chẳng hạn như Application.LocalUserAppDataPath (là kỹ thuật yêu thích cá nhân của tôi). Đường dẫn khung sẽ bao gồm các vòng loại ứng dụng cụ thể trên đường dẫn mà nó trả về để phân biệt giữa (ví dụ: các phiên bản ứng dụng khác nhau của bạn.

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