2008-09-28 9 views
16

Ich dachte, dass CSIDL_COMMON_APPDATA\company\product der Ort sein sollte, um Dateien, die für alle Benutzer der Anwendung gemeinsam sind und die die Anwendung ändern kann, jedoch unter Vista ist dies ein schreibgeschützter Speicherort, sofern vom Installer (wie MSDN geändert - http://msdn.microsoft.com/en-us/library/ms995853.aspx), also ... was ist das Beste? Ändern Sie die Sicherheitseinstellungen des Standorts, um das Schreiben zu ermöglichen, oder verwenden Sie stattdessen CSIDL_COMMON_DOCUMENTS\company\product? Vielleicht gibt es eine dritte Option?Wohin mit allgemeinen beschreibbaren Anwendungsdateien?

Gibt es auch irgendwo eine "offizielle" Microsoft-Empfehlung?

Antwort

2

Ich denke, this post kann einige Fragen beantworten, aber es scheint ein schwieriges Problem für viele.

Offenbar bietet CSIDL_COMMON_DOCUMENTS eine gemeinsame Abhilfe

+0

Sorry, ich sehe nicht, wie das die Frage beantwortet. Ich weiß, wie ich den Weg finde, ich frage, was der richtige Weg ist. – dennisV

+0

Ja, danke. Schade, es gibt keine offizielle Antwort auf dieses Problem. – dennisV

15

Ändern nur die Sicherheit auf einem bestimmten Unterverzeichnis des AppData Verzeichnis (dies ist von the link you provided):

CSIDL_COMMON_APPDATA Dieser Ordner sollte verwendet werden Anwendungsdaten das ist nicht benutzerspezifisch. Für Beispiel kann eine Anwendung ein Rechtschreibprüfung-Wörterbuch, eine Datenbank clip-art oder eine Protokolldatei in dem Ordner CSIDL_COMMON_APPDATA speichern. Diese Information wird nicht roamen und ist für jeden verfügbar, der den Computer verwendet. Standardmäßig ist dieser Speicherort schreibgeschützt für normale (nicht-admin, nicht-power) Benutzer. Wenn eine Anwendung normale Benutzer erfordert Schreib Zugriff auf ein anwendungsspezifische Unterverzeichnis von CSIDL_COMMON_APPDATA haben, dann muss die Anwendung explizit die Sicherheit auf diesem Unterverzeichnis während Setup-Anwendung ändern. Die geänderte Sicherheit muss im Lieferanten Fragebogen dokumentiert sein.

+0

Ja, genau das denke ich auch. Aber es scheint, als ob sie (Microsoft) nicht wollen, dass Sie Dateien dort hineinlegen und stattdessen die COMMON_DOCUMENTS verwenden. Vielen Dank. – dennisV

+0

Woher bekommen Sie, dass sie nicht wollen, dass Sie dort Dateien ablegen? Es sieht so aus, als ob sie ziemlich glücklich damit sind, Dateien dort zu platzieren - Sie sollten sie in Ihr eigenes Unterverzeichnis legen und die Sicherheit richtig verwalten. –

+0

Ich nehme an, aber das Ändern der Sicherheit ist ein zusätzlicher Schritt, von dem ich annehme (vielleicht zu Unrecht), dass er dort platziert wird, um Leute daran zu hindern, diesen Ordner für beschreibbare Dateien zu verwenden. – dennisV

1

Richtlinien für Vista/UAC finden Sie here. Durchsuche diese Seite nach "CSIDL" und du wirst einige "offizielle" Antworten finden.

+0

Danke - alles verweist auf das Verzeichnis, das ich ursprünglich verwenden wollte. Ich denke, es ist die richtige Antwort :) – dennisV

+0

Es ist ein schönes warmes Gefühl herauszufinden, dass du die ganze Zeit recht hast, oder? ;-) –

4

Im Folgenden finden Sie ein einfaches Beispiel zum Erstellen von Dateien und Ordnern mit Lese-/Schreibberechtigung für alle Benutzer im Ordner Allgemeine Anwendungsdaten (CSIDL_COMMON_APPDATA). Jeder Benutzer kann diesen Code ausführen alle anderen Benutzer die Berechtigung zu den Dateien & Ordner zu schreiben zu geben:

#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; 
}