2008-09-28 23 views
16

Tôi nghĩ rằng CSIDL_COMMON_APPDATA\company\product nên là nơi để đặt các tệp phổ biến cho tất cả người dùng của ứng dụng và ứng dụng có thể sửa đổi, tuy nhiên, trên Vista đây là vị trí chỉ đọc, trừ khi được sửa đổi bởi trình cài đặt (theo MSDN) - http://msdn.microsoft.com/en-us/library/ms995853.aspx), vậy ... gì là tốt nhất? Thay đổi cài đặt bảo mật của vị trí để cho phép viết hoặc sử dụng CSIDL_COMMON_DOCUMENTS\company\product thay thế? Có lẽ có một lựa chọn thứ ba?Nơi đặt các tệp ứng dụng có thể ghi phổ biến?

Ngoài ra, có đề xuất "chính thức" của Microsoft về vấn đề này ở đâu đó không?

Trả lời

2

Tôi nghĩ rằng this post có thể trả lời một số câu hỏi, nhưng có vẻ như là một vấn đề khó đối với nhiều người.

Rõ ràng, CSIDL_COMMON_DOCUMENTS cung cấp một phương pháp phổ biến

+0

Xin lỗi, tôi không thấy cách trả lời câu hỏi. Tôi biết làm thế nào để có được con đường, tôi hỏi con đường thích hợp để có được là gì. – dennisV

+0

Vâng, cảm ơn. Quá xấu không có câu trả lời chính thức cho vấn đề này. – dennisV

15

Sửa chỉ là an ninh trên một thư mục cụ thể của thư mục AppData (đây là từ the link you provided):

CSIDL_COMMON_APPDATA này thư mục nên được sử dụng cho dữ liệu ứng dụng không dành riêng cho người dùng. Ví dụ: , một ứng dụng có thể lưu trữ từ điển kiểm tra chính tả , một cơ sở dữ liệu của clip-art hoặc tệp nhật ký trong thư mục CSIDL_COMMON_APPDATA. Thông tin này sẽ không chuyển vùng và là có sẵn cho bất kỳ ai sử dụng máy tính . Theo mặc định, vị trí này là chỉ đọc cho người dùng bình thường (không phải là quản trị viên, không quyền lực). Nếu một ứng dụng đòi hỏi người sử dụng bình thường để có quyền ghi truy cập vào một ứng dụng cụ thể thư mục con của CSIDL_COMMON_APPDATA, sau đó ứng dụng phải rõ ràng thay đổi bảo mật trên mà thư mục con trong ứng dụng thiết lập. Bảo mật đã sửa đổi phải là được ghi trong Bảng câu hỏi của Nhà cung cấp .

+0

Vâng, đó là những gì tôi đang nghĩ là tốt. Nhưng nó có vẻ như họ (Microsoft) không muốn bạn đặt các tập tin trong đó và thay vào đó sử dụng một COMMON_DOCUMENTS một. Cảm ơn. – dennisV

+0

Bạn nhận được điều gì ở chỗ họ không muốn bạn đặt các tệp ở đó? Có vẻ như họ khá hài lòng với việc bạn đặt các tệp ở đó - bạn nên đặt chúng vào thư mục con của riêng mình và quản lý bảo mật một cách chính xác. –

+0

Tôi cho rằng vậy, nhưng việc sửa đổi bảo mật là một bước bổ sung mà tôi cho rằng (có lẽ sai) được đặt ở đó để ngăn cản mọi người sử dụng thư mục này cho các tệp có thể ghi. – dennisV

1

Hướng dẫn cho Vista/UAC có thể được tìm thấy here. Tìm kiếm trang đó cho "CSIDL" và bạn sẽ tìm thấy một số câu trả lời "chính thức".

+0

Cảm ơn - tất cả chỉ đến thư mục mà tôi đã định sử dụng ban đầu. Tôi đoán đó là câu trả lời đúng sau đó :) – dennisV

+0

Đó là một cảm giác ấm áp tốt đẹp, tìm ra rằng bạn đã đúng tất cả cùng, phải không? ;-) –

4

Dưới đây là một ví dụ đơn giản cho thấy cách tạo tệp và thư mục có quyền Đọc/Ghi cho tất cả người dùng trong thư mục Dữ liệu ứng dụng chung (CSIDL_COMMON_APPDATA). Bất kỳ người dùng nào cũng có thể chạy mã này để cấp cho tất cả người dùng khác quyền ghi vào các tệp & thư mục:

#include <windows.h> 

#include <shlobj.h> 
#pragma comment(lib, "shell32.lib") 

// for PathAppend 
#include <Shlwapi.h> 
#pragma comment(lib, "Shlwapi.lib") 

#include <stdio.h> 
#include <aclapi.h> 
#include <tchar.h> 
#pragma comment(lib, "advapi32.lib")  

#include <iostream> 
#include <fstream> 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DWORD dwRes, dwDisposition; 
    PSID pEveryoneSID = NULL; 
    PACL pACL = NULL; 
    PSECURITY_DESCRIPTOR pSD = NULL; 
    EXPLICIT_ACCESS ea; 
    SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; 
    SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY; 
    SECURITY_ATTRIBUTES sa; 

    // Create a well-known SID for the Everyone group. 
    if (!AllocateAndInitializeSid(&SIDAuthWorld, 1, 
        SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, 
        &pEveryoneSID)) 
    { 
     _tprintf(_T("AllocateAndInitializeSid Error %u\n"), GetLastError()); 
     goto Cleanup; 
    } 

    // Initialize an EXPLICIT_ACCESS structure for an ACE. 
    // The ACE will allow Everyone access to files & folders you create. 
    ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); 
    ea.grfAccessPermissions = 0xFFFFFFFF; 
    ea.grfAccessMode = SET_ACCESS; 

    // both folders & files will inherit this ACE 
    ea.grfInheritance= CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE; 
    ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; 
    ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; 
    ea.Trustee.ptstrName = (LPTSTR) pEveryoneSID; 

    // Create a new ACL that contains the new ACEs. 
    dwRes = SetEntriesInAcl(1, &ea, NULL, &pACL); 
    if (ERROR_SUCCESS != dwRes) 
    { 
     _tprintf(_T("SetEntriesInAcl Error %u\n"), GetLastError()); 
     goto Cleanup; 
    } 

    // Initialize a security descriptor. 
    pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); 
    if (NULL == pSD) 
    { 
     _tprintf(_T("LocalAlloc Error %u\n"), GetLastError()); 
     goto Cleanup; 
    } 

    if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) 
    { 
     _tprintf(_T("InitializeSecurityDescriptor Error %u\n"), GetLastError()); 
     goto Cleanup; 
    } 

    // Add the ACL to the security descriptor. 
    if (!SetSecurityDescriptorDacl(pSD, 
      TRUE,  // bDaclPresent flag 
      pACL, 
      FALSE)) // not a default DACL 
    { 
     _tprintf(_T("SetSecurityDescriptorDacl Error %u\n"), GetLastError()); 
     goto Cleanup; 
    } 

    // Initialize a security attributes structure. 
    sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
    sa.lpSecurityDescriptor = pSD; 
    sa.bInheritHandle = FALSE; 



    TCHAR szPath[MAX_PATH]; 

    if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA|CSIDL_FLAG_CREATE, NULL, 0, szPath))) 
    { 
     PathAppend(szPath, TEXT("Your Shared Folder")); 

     if (!CreateDirectory(szPath, &sa) 
      && GetLastError() != ERROR_ALREADY_EXISTS) 
     { 
      goto Cleanup; 
     } 

     PathAppend(szPath, TEXT("textitup.txt")); 

     HANDLE hFile = CreateFile(szPath, GENERIC_READ | GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, 0, 0); 
     if (hFile == INVALID_HANDLE_VALUE) 
      goto Cleanup; 
     else 
      CloseHandle(hFile); 

     //TODO: do the writing 
     ofstream fsOut; 
     fsOut.exceptions(ios::eofbit | ios::failbit | ios::badbit); 
     fsOut.open(szPath, ios::out | ios::binary | ios::trunc); 

     fsOut << "Hello world!\n"; 
     fsOut.close(); 
    } 

Cleanup: 

    if (pEveryoneSID) 
     FreeSid(pEveryoneSID); 
    if (pACL) 
     LocalFree(pACL); 
    if (pSD) 
     LocalFree(pSD); 

    return 0; 
} 
Các vấn đề liên quan