ámbito visual usuario usar studio sistema elemento declarado configuración configuracion con archivo app aplicaciones admite actual c++ windows winapi uac application-data

c++ - visual - no se ha declarado el elemento configuration



Dónde poner archivos comunes de aplicaciones modificables? (4)

Pensé que CSIDL_COMMON_APPDATA/company/product debería ser el lugar para colocar los archivos que son comunes para todos los usuarios de la aplicación y que la aplicación puede modificar, sin embargo, en Vista esta es una ubicación de solo lectura, a menos que el instalador la modifique (como por MSDN - http://msdn.microsoft.com/en-us/library/ms995853.aspx ), entonces ... ¿qué es lo mejor? ¿Modificar la configuración de seguridad de la ubicación para permitir la escritura o usar CSIDL_COMMON_DOCUMENTS/company/product lugar? Tal vez hay una tercera opción?

Además, ¿hay alguna recomendación "oficial" de Microsoft sobre esto en alguna parte?


Creo que esta publicación puede responder algunas preguntas, pero parece ser un problema difícil para muchos.

Aparentemente, CSIDL_COMMON_DOCUMENTS proporciona una solución común


Modifique solo la seguridad en un subdirectorio específico del directorio AppData (esto proviene del enlace que proporcionó ):

CSIDL_COMMON_APPDATA Esta carpeta debe usarse para datos de aplicación que no sean específicos del usuario. Por ejemplo, una aplicación puede almacenar un diccionario de revisión ortográfica, una base de datos de imágenes prediseñadas o un archivo de registro en la carpeta CSIDL_COMMON_APPDATA. Esta información no vagará y está disponible para cualquiera que use la computadora. De forma predeterminada, esta ubicación es de solo lectura para usuarios normales (que no son administradores ni usuarios de energía). Si una aplicación requiere que los usuarios normales tengan acceso de escritura a un subdirectorio específico de aplicación de CSIDL_COMMON_APPDATA, entonces la aplicación debe modificar explícitamente la seguridad en ese subdirectorio durante la configuración de la aplicación. La seguridad modificada debe estar documentada en el Cuestionario del proveedor.


Pautas para Vista / UAC se pueden encontrar aquí . Busque esa página para " CSIDL " y encontrará algunas respuestas "oficiales".


Aquí hay un ejemplo simple que muestra cómo crear archivos y carpetas con permiso de Lectura / Escritura para todos los usuarios en la carpeta de Datos comunes de la aplicación (CSIDL_COMMON_APPDATA). Cualquier usuario puede ejecutar este código para dar permiso a todos los demás usuarios para escribir en los archivos y carpetas:

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