2010-07-10 18 views
26

Gần đây tôi đã cập nhật ứng dụng Visual Basic 6.0 của mình và hiện bao gồm tệp exe.manifest để ngăn chặn UAC Ảo hóa. Sau khi áp dụng bản cập nhật này, một số người dùng không thể tìm thấy tệp dữ liệu của họ (Access tệp MDB) và sau khi tìm kiếm hệ thống, họ sẽ tìm thấy nó trong C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86).Tại sao tệp được đặt trong "C: Users <username> Tệp AppData Local VirtualStore Program (x86)"?

Khu vực thư mục này dành cho và cách thức/khi nào các tệp được chuyển đến khu vực này? Làm thế nào để chúng ta ngăn chặn nó? Tôi hy vọng rằng ứng dụng của tôi sử dụng một số điều này sẽ không xảy ra nữa. Các tệp đã được đặt ở đó trước khi tệp kê khai được sử dụng vì ứng dụng đã được đặt trong UAC Virtualization chưa?

Trả lời

6

Tôi đoán là tệp kê khai của bạn có tên asInvoker và ứng dụng của bạn cố gắng ghi vào Tệp chương trình. Khi người dùng chạy nó mà không có tệp kê khai, nó đã ghi vào cửa hàng ảo cho Tệp chương trình, đó là đường dẫn nơi họ tìm thấy một số tệp sau này.Khi họ chạy với một biểu hiện, nó không viết được gì cả (với quyền truy cập bị từ chối) nhưng ứng dụng của bạn ẩn lỗi của họ, hoặc họ không hiểu lỗi nên họ không đề cập đến nó cho bạn.

Sửa lỗi ngắn hạn - sử dụng tệp kê khai requireAdministrator. Điều này sẽ kích thích người dùng nhưng viết sẽ thành công. Sửa chữa lâu dài - không ghi vào ProgramFiles. Có các tùy chọn tốt hơn cho mỗi người dùng, như AppData.

+3

Sửa lỗi ngắn hạn "sử dụng tệp kê khai requireaccounts". Er, không, đừng! –

32

Ứng dụng không chạy với đặc quyền được nâng cao sẽ không có quyền truy cập vào các thư mục Program FilesProgram Files (x86). Điều này là tốt cho an toàn. Ngoài ra, trong hầu hết các trường hợp khi nhà phát triển yêu cầu chương trình của mình lưu dữ liệu trong thư mục Program Files, chẳng hạn như cài đặt chương trình, anh đã quên hoàn toàn cài đặt chương trình đó là điều dành cho mỗi người dùng! Tức là, mọi người dùng trên máy tính cục bộ đều có thể sử dụng chương trình mà không ảnh hưởng đến người dùng khác. Nói cách khác, thay vào đó, ứng dụng được xử lý tốt nên lưu cài đặt của nó trong thư mục

C:\Users\<User Name>\AppData\Local\<Manufacturer>\<Product>\<Product Version> 

.

Ví dụ, phần mềm AlgoSim tôi viết để

C:\Users\<User Name>\AppData\Local\Rejbrand\AlgoSim\2.0 

Tất nhiên, con đường

C:\Users\<User Name>\AppData\Local\ 

phải được xem xét-up tự động khi chạy. Sử dụng

SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path); 

cho việc này. Kể từ khi Windows Vista, các ứng dụng không chạy với đặc quyền nâng lên cố gắng ghi vào thư mục Program Files (hoặc Program Files (x86)) trên thực tế sẽ ghi vào thư mục VirtualStore, vô tình. Microsoft nghĩ rằng điều này sẽ tốt hơn một lỗi chương trình (do hạn chế truy cập). Và thực sự, nhờ vào điều này, hầu hết các chương trình cũ lưu cài đặt của chúng trong thư mục Program Files sẽ tiếp tục hoạt động với Windows Vista + và mỗi người dùng sẽ nhận được cài đặt của riêng mình, làm tiền thưởng, mặc dù nhà sản xuất phần mềm gốc không nghĩ về điều này .

Bạn có thể sử dụng tệp kê khai để cho Windows biết rằng ứng dụng của bạn biết VirtualStore và Windows không nên thay đổi bất kỳ đường dẫn nào trong thời gian chạy. Nhưng nếu bạn thực sự muốn có thể ghi vào thư mục Program Files, thì tôi nghĩ rằng bạn phải chạy ứng dụng với các đặc quyền được nâng lên, mỗi lần, điều này không thể tránh khỏi nói chung.

Chi tiết về cách tạo tệp kê khai để làm cho chương trình của bạn hiển thị lời nhắc UAC trên mỗi lần thực thi và cách vô hiệu hoá VirtualStore, đã được giải quyết tại một số câu hỏi tràn trước Stack  . Vui lòng sử dụng hộp tìm kiếm!

+0

Phải không * 'C: \ Users \ \ AppData \ Roaming \ \ \ ' * thay thế? Hiện tại tôi không biết nền tảng, nhưng tôi quan sát thấy rằng rất nhiều ứng dụng tuân thủ Windows hiện đại sử dụng nhánh 'Roaming' thay vì' Local'. – Wolf

+0

@Wolf: Vâng, đó có lẽ là lựa chọn tốt hơn. –

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