Où placer les fichiers d’application inscriptibles communs?

Je pensais que CSIDL_COMMON_APPDATA\company\product devrait être l’endroit idéal pour mettre des fichiers communs à tous les utilisateurs de l’application et que l’application peut modifier, cependant, sous Vista, cet emplacement est en lecture seule, sauf s’il est modifié par le programme d’installation (comme par MSDN – http://msdn.microsoft.com/en-us/library/ms995853.aspx ), alors … quoi de mieux? Modifiez les parameters de sécurité de l’emplacement pour autoriser l’écriture ou utilisez CSIDL_COMMON_DOCUMENTS\company\product ? Peut-être y a-t-il une troisième option?

En outre, y a-t-il une recommandation Microsoft “officielle” à ce sujet quelque part?

Modifiez simplement la sécurité sur un sous-répertoire spécifique du répertoire AppData (à partir du lien que vous avez fourni ):

CSIDL_COMMON_APPDATA Ce dossier doit être utilisé pour les données d’application non spécifiques à l’utilisateur. Par exemple, une application peut stocker un dictionnaire de vérification orthographique, une firebase database de clipart ou un fichier journal dans le dossier CSIDL_COMMON_APPDATA. Ces informations ne seront pas diffusées et sont accessibles à toute personne utilisant l’ordinateur. Par défaut, cet emplacement est en lecture seule pour les utilisateurs normaux (non administrateurs et non actifs). Si une application nécessite que les utilisateurs normaux aient un access en écriture à un sous-répertoire spécifique à l’application de CSIDL_COMMON_APPDATA, l’application doit alors modifier explicitement la sécurité de ce sous-répertoire lors de la configuration de l’application. La sécurité modifiée doit être documentée dans le questionnaire du fournisseur.

Voici un exemple simple montrant comment créer des fichiers et des dossiers avec une autorisation en lecture / écriture pour tous les utilisateurs du dossier Common App Data (CSIDL_COMMON_APPDATA). Tout utilisateur peut exécuter ce code pour autoriser tous les autres utilisateurs à écrire dans les fichiers et dossiers:

 #include  #include  #pragma comment(lib, "shell32.lib") // for PathAppend #include  #pragma comment(lib, "Shlwapi.lib") #include  #include  #include  #pragma comment(lib, "advapi32.lib") #include  #include  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 = SetEnsortingesInAcl(1, &ea, NULL, &pACL); if (ERROR_SUCCESS != dwRes) { _tprintf(_T("SetEnsortingesInAcl 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 atsortingbutes 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; } 

Je pense que ce post peut répondre à certaines questions, mais cela semble être un problème difficile pour beaucoup.

Apparemment, CSIDL_COMMON_DOCUMENTS fournit une solution de contournement commune

Vous trouverez les directives pour Vista / UAC ici . Recherchez cette page pour ” CSIDL ” et vous trouverez des réponses “officielles”.