2008-09-28 13 views
16

Pomyślałem, że CSIDL_COMMON_APPDATA\company\product powinno być miejscem do umieszczania plików wspólnych dla wszystkich użytkowników aplikacji i że aplikacja może modyfikować, jednak w systemie Vista jest to lokalizacja tylko do odczytu, chyba że zmodyfikowana przez instalatora (jak na MSDN - http://msdn.microsoft.com/en-us/library/ms995853.aspx), więc ... co jest najlepsze? Zmodyfikuj ustawienia zabezpieczeń lokalizacji, aby umożliwić zapisywanie lub używanie zamiast tego opcji CSIDL_COMMON_DOCUMENTS\company\product? Może jest trzecia opcja?Gdzie umieścić wspólne zapisywalne pliki aplikacji?

Czy istnieje również "oficjalne" zalecenie firmy Microsoft w tej sprawie?

Odpowiedz

2

Myślę, że this post może odpowiedzieć na kilka pytań, ale dla wielu wydaje się to trudnym problemem.

Najwyraźniej CSIDL_COMMON_DOCUMENTS zapewnia

+0

Niestety, nie widzę w jaki sposób odpowiada na pytanie. Wiem, jak uzyskać ścieżkę, pytam, jaka jest właściwa ścieżka. – dennisV

+0

Tak, dziękuję. Szkoda, że ​​nie ma oficjalnej odpowiedzi na ten problem. – dennisV

15

Modyfikuj tylko bezpieczeństwo na konkretnym podkatalogu katalogu AppData (to jest od the link you provided) wspólnego rozwiązania:

CSIDL_COMMON_APPDATA Ten folder powinien być używany dane aplikacji , które nie są specyficzne dla użytkownika. W przypadku przykładu aplikacja może przechowywać słownik sprawdzania pisowni , bazę danych o lub plik dziennika w folderze CSIDL_COMMON_APPDATA. Ta informacja o numerze nie będzie dostępna dla wszystkich korzystających z komputera . Domyślnie ta lokalizacja to tylko do odczytu dla zwykłych użytkowników (bez uprawnień administratora, ). Jeśli aplikacja wymaga zwykli użytkownicy mają zapisu dostęp do konkretnego podkatalogu nanoszenia CSIDL_COMMON_APPDATA, wówczas wniosek musi wyraźnie modyfikować bezpieczeństwa na tym podkatalogu podczas aplikacji konfiguracji. Zmodyfikowane zabezpieczenie musi być udokumentowane w Kwestionariuszu dostawcy .

+0

Tak, właśnie o tym myślę. Wygląda jednak na to, że oni (Microsoft) nie chcą, abyś tam umieszczał pliki i zamiast tego używał pliku COMMON_DOCUMENTS. Dzięki. – dennisV

+0

Skąd bierzesz, że nie chcą, żebyś tam umieszczał pliki? Wygląda na to, że są zadowoleni z umieszczania tam plików - powinieneś umieścić je w swoim własnym podkatalogu i poprawnie zarządzać bezpieczeństwem. –

+0

Przypuszczam, że tak, ale modyfikowanie zabezpieczeń jest dodatkowym krokiem, który zakładam (być może błędnie), aby zniechęcić ludzi do używania tego folderu do zapisywania plików. – dennisV

1

Wskazówki dotyczące systemu Vista/UAC można znaleźć pod adresem here. Wyszukaj tę stronę dla "CSIDL", a znajdziesz "oficjalne" odpowiedzi.

+0

Dzięki - wszystko wskazuje na katalog, który pierwotnie planowałem użyć. Myślę, że to właściwa odpowiedź:) – dennisV

+0

To miłe, ciepłe uczucie, że masz rację przez cały czas, prawda? ;-) –

4

Oto prosty przykład pokazujący, jak tworzyć pliki i foldery z uprawnieniami do odczytu/zapisu dla wszystkich użytkowników w folderze Common App Data (CSIDL_COMMON_APPDATA). Każdy użytkownik może uruchomić ten kod, aby podać wszelkie inne uprawnienia użytkownikom do pisania do plików & folderach:

#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; 
} 
Powiązane problemy