2012-04-22 26 views
5

Tôi có một ứng dụng cần tạo thư mục cài đặt bên trong thư mục% APPDATA% của người dùng. Để thực hiện điều này, nó sử dụng mã tương tự như sau:Ứng dụng không thể ghi vào% APPDATA% (nhưng người dùng có thể)

std::string appDataBase = getenv("APPDATA"); 
std::string appDir = appDataBase + "\\MyDir"; 

std::cerr << "About to invoke _mkdir(" << appDir << ")" << std::endl; 
int rv = _mkdir(appDir.c_str()); 
std::cerr << "_mkdir returned " << rv << ", errno = " << errno << std::endl; 

Tuy nhiên, khi mã này chạy, cuộc gọi _mkdir thất bại và errno được thiết lập để EACCES:

About to invoke _mkdir(C:\Users\mdm\AppData\Roaming\MyDir) 
_mkdir returned -1, errno = 13 

tôi sẽ giả định đây là một vấn đề quyền đơn giản, ngoại trừ thực tế là (1) tôi có thể tạo thư mục theo cách thủ công trong Explorer mà không có bất kỳ vấn đề quyền nào và (2) mã chính xác hoạt động tốt nếu tôi sao chép nó vào một dự án của chính nó.

Tôi đã thực hiện tìm kiếm rộng rãi thông tin về sự cố này nhưng chỉ có thể tìm các cuộc thảo luận về các vấn đề quyền chung chẳng hạn như người dùng không thể truy cập/ghi vào thư mục này bằng Explorer. Mã trong ứng dụng của tôi hoạt động nếu tôi chạy nó như là Quản trị viên, vì vậy rõ ràng có một cái gì đó kỳ lạ xảy ra với các điều khoản của nó, nhưng tôi không biết những gì khác để kiểm tra. Tôi đã kiểm tra với Process Explorer và xác nhận rằng ứng dụng đang chạy với tài khoản người dùng của tôi, có quyền ghi đầy đủ vào thư mục% APPDATA% và tôi đã đảm bảo rằng cây% APPDATA% không được đặt thành Ẩn hoặc Chỉ đọc.

Có một số loại "ID người dùng hiệu quả" hoặc "quyền có hiệu lực" có thể được đặt trên ứng dụng Windows, có thể phụ thuộc vào thứ gì đó trong cấu hình xây dựng hoặc quá trình khởi tạo không? Có bất kỳ yếu tố nào khác có thể ngăn một ứng dụng cụ thể ghi vào% APPDATA% trong khi các quy trình người dùng khác có thể không?

Cập nhật

Tiếp tục điều tra cho thấy sự khác biệt trong hành vi không liên quan đến nội dung của mã này, nhưng vị trí của thực thi trong hệ thống tập tin. Ứng dụng của tôi đang được xây dựng từ cây nguồn bên trong thư mục Development trong thư mục người dùng của tôi và cuộc gọi _mkdir không thành công đối với các tệp thi hành trong thư mục này; tuy nhiên, sao chép tệp .exe vào một thư mục mới C:\Development cho phép nó hoạt động tốt (mặc dù di chuyển thư mục Development hiện tại không). Chương trình thử nghiệm đơn giản nằm bên trong Documents\Visual Studio\Projects, cũng có vẻ là một vị trí thỏa đáng.

+0

"chính xác cùng một mã hoạt động tốt nếu tôi sao chép nó vào một dự án của chính nó" - sau đó bạn có thể làm một cái gì đó thú vị trong mã xung quanh. Có thể không thực sự đoán những gì mặc dù. – Mat

+0

@Mat: đó sẽ là phỏng đoán của tôi quá - tiếc là tôi có ít kinh nghiệm phát triển trên Windows vì vậy tôi không chắc chắn những gì cần tìm trong mã xung quanh. –

+0

Là một biện pháp gỡ lỗi, hãy thử sử dụng Process Monitor (tìm kiếm trang web MS) để kiểm tra lại đường dẫn mà hệ thống đang thực sự cố tạo và mã lỗi nào được hệ thống tệp trả lại. Có thể có một số loại chuyển hướng đang diễn ra, mặc dù tôi không hiểu tại sao đó lại là trường hợp ở đây. –

Trả lời

0

Windows có bộ chức năng khác nhau (và lớn) để thay đổi ngữ cảnh bảo mật. Xem here đối với một số người.

Có lẽ dự án chứa mã đó đang thay đổi bối cảnh bảo mật? Nếu chương trình đang chạy như một máy chủ truy cập công cộng, tôi có thể mong đợi nó để gọi ImpersonateAnonymousToken(), ví dụ.

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