2008-09-28 3 views
16

Je pensais que CSIDL_COMMON_APPDATA\company\product devrait être l'endroit pour mettre les fichiers qui sont communs à tous les utilisateurs de l'application et que l'application peut modifier, cependant, Vista est un emplacement en lecture seule, sauf si modifié par le programme d'installation (selon MSDN - http://msdn.microsoft.com/en-us/library/ms995853.aspx), alors ... quoi de mieux? Modifier les paramètres de sécurité de l'emplacement pour autoriser l'écriture ou utiliser CSIDL_COMMON_DOCUMENTS\company\product à la place? Peut-être qu'il y a une troisième option?Où placer les fichiers d'application accessibles en écriture courants?

De plus, existe-t-il une recommandation «officielle» de Microsoft à cet égard?

Répondre

2

Je pense que this post peut répondre à quelques questions, mais il semble un problème difficile pour beaucoup.

Apparemment, CSIDL_COMMON_DOCUMENTS fournit une solution commune

+0

Désolé, je ne vois pas comment cela répond à la question. Je sais comment obtenir le chemin, je demande quel est le bon chemin à prendre. – dennisV

+0

Oui, merci. Dommage, il n'y a pas de réponse officielle à ce problème. – dennisV

15

Modifier seulement la sécurité sur un sous-répertoire spécifique du répertoire AppData (ce qui est de the link you provided):

CSIDL_COMMON_APPDATA Ce dossier doit être utilisé pour données d'application qui n'est pas spécifique à l'utilisateur. Par exemple, une application peut stocker un dictionnaire de vérification orthographique , une base de données clip-art ou un fichier journal dans le dossier CSIDL_COMMON_APPDATA. Cette information ne se déplacera pas et est disponible à quiconque utilisant l' ordinateur. Par défaut, cet emplacement est en lecture seule pour les utilisateurs normaux (non administrateur, non-utilisateur). Si une application exige que les utilisateurs normaux d'avoir écriture accès à une application spécifique sous-répertoire de CSIDL_COMMON_APPDATA, l'application doit explicitement modifier la sécurité sur ce sous-répertoire lors de l'installation de l'application . Le titre modifié doit être documenté dans le questionnaire vendeur .

+0

Oui, c'est ce que je pense aussi. Mais il semble qu'ils (Microsoft) ne veulent pas que vous y mettiez des fichiers et utilisiez plutôt le fichier COMMON_DOCUMENTS. Merci. – dennisV

+0

D'où obtenez-vous qu'ils ne veulent pas que vous y mettiez des fichiers? On dirait qu'ils sont plutôt contents de mettre des fichiers là-bas - vous devriez les mettre dans votre propre sous-répertoire et gérer correctement la sécurité. –

+0

Je suppose que oui, mais la modification de la sécurité est une étape supplémentaire que je suppose (peut-être à tort) est placé là pour décourager les gens d'utiliser ce dossier pour les fichiers en écriture. – dennisV

1

Les directives pour Vista/UAC peuvent être trouvées here. Recherchez cette page pour "CSIDL" et vous trouverez quelques réponses "officielles".

+0

Merci - tout pointe vers le répertoire que je prévoyais à l'origine d'utiliser. Je suppose que c'est la bonne réponse alors :) – dennisV

+0

C'est une belle sensation de chaleur en découvrant que tu avais raison tout au long, n'est-ce pas? ;-) –

4

Voici un exemple simple montrant comment créer des fichiers et des dossiers avec l'autorisation de lecture/écriture pour tous les utilisateurs du dossier Common App Data (CSIDL_COMMON_APPDATA). Tout utilisateur peut exécuter ce code pour donner tous les autres utilisateurs l'autorisation d'écrire sur les fichiers & dossiers:

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