2008-09-28 55 views
16

我认为CSIDL_COMMON_APPDATA\company\product应该是放置应用程序的所有用户共有的文件的地方,并且应用程序可以修改,但是,在Vista上,这是一个只读位置,除非安装程序修改(按照MSDN - http://msdn.microsoft.com/en-us/library/ms995853.aspx),那么...什么是最好的?修改位置的安全设置以允许编写或使用CSIDL_COMMON_DOCUMENTS\company\product?也许还有第三种选择?何处放置普通的可写应用程序文件?

此外,有没有一个“官方”微软推荐这个地方?

回答

2

我认为this post可能会回答一些问题,但对许多人来说这似乎是一个难题。

显然,CSIDL_COMMON_DOCUMENTS提供了一个通用的解决方法

+0

对不起,我看不出这回答了这个问题。我知道如何找到路径,我在问什么是正确的路径。 – dennisV 2008-09-28 23:52:50

+0

是的,谢谢。太糟糕了,这个问题没有正式的答案。 – dennisV 2008-09-28 23:58:36

15

修改只是对AppData目录的特定子目录的安全性(这是从the link you provided):

CSIDL_COMMON_APPDATA此文件夹 应该用于不是用户特定的应用数据 。对于 示例,应用程序可能会在 CSIDL_COMMON_APPDATA文件夹中存储 拼写检查字典, 剪贴画数据库或日志文件。此 信息不会漫游,并且 可供任何人使用 计算机。默认情况下,该位置为 对于普通用户(非管理员, 非电源用户)为只读。 如果应用程序需要 普通用户有写 访问应用程序特定 子目录CSIDL_COMMON_APPDATA的, 那么应用程序必须明确 修改过程中的应用 设置上 子目录中的安全性。在供应商 调查问卷中记录的修改后的安全性必须为 。

+0

是的,这就是我的想法。但它看起来好像他们(微软)不希望你把文件放在那里,而是使用COMMON_DOCUMENTS之一。谢谢。 – dennisV 2008-09-28 23:57:51

1

Vista/UAC指南可以在here找到。搜索该页面的“CSIDL”,你会发现一些“官方”的答案。

4

下面是一个简单的示例,显示如何为Common App Data文件夹(CSIDL_COMMON_APPDATA)中的所有用户创建具有读/写权限的文件和文件夹。任何用户都可以运行此代码给写入到文件夹&所有其他用户的权限:

#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; 
} 
相关问题