【问题标题】:Install for all users and data access为所有用户和数据访问安装
【发布时间】:2012-01-09 22:52:10
【问题描述】:

修改我的安装程序应用程序以将我的 exe 和几个数据文件安装到所有用户都可以访问的位置的最佳方法是什么?我希望任何 XP/Vista/Win7 用户在他们的开始菜单和桌面上都有选项。一旦他们运行这个应用程序,他们需要能够对应用程序附带的一些数据文件进行写入更改。我目前正在使用用户配置文件漫游数据文件夹或类似的东西。

【问题讨论】:

  • 您希望用户能够修改自己的数据文件副本还是修改通用副本?
  • 常见。更重要的是把它放在一个允许改变的地方,我过去遇到过问题。我想我理解那部分,我只是不确定如何为“所有用户”设置快捷方式。谢谢。
  • 有一个所有用户/公共配置文件,但它只为所有用户提供读取权限,而不是写入权限。请参阅我的答案,了解我过去成功使用的解决方案。
  • 您使用哪种安装工具来创建安装程序?
  • 我正在使用 Visual Studio。

标签: c# installation


【解决方案1】:

首先您需要将安装类型更改为每台机器:

  • 在解决方案资源管理器中选择您的设置项目
  • 在其“属性”窗格中将 InstallAllUsers 设置为 True

之后就可以配置默认安装文件夹了:

  • 转到您的设置项目文件系统编辑器
  • 选择应用程序文件夹
  • 在其属性窗格中将 DefaultLocation 设置为:

    [CommonAppDataFolder][Manufacturer]\[ProductName]

  • 在应用程序文件夹中添加您的文件

您可以在此处阅读有关 CommonAppDataFolder 的更多信息:http://msdn.microsoft.com/en-us/library/windows/desktop/aa367992(v=vs.85).aspx

最后,在文件系统编辑器中,您可以在User's Desktop 文件夹中添加快捷方式。它使用DesktopFolder 属性,该属性会自动解析到所有用户桌面以进行每台机器的安装。

【讨论】:

    【解决方案2】:

    如果用户应该能够修改自己的数据副本,我确实会使用漫游数据文件夹,除非文件很大,这不利于漫游:每当启动应用程序时,检查文件是否存在在用户的漫游文件夹中。如果没有,请从程序目录中的通用只读副本为该用户创建初始副本。

    OTOH,如果用户需要修改公共副本,则在程序目录中创建一个数据子目录并修改其安全描述符以授予用户组的写入权限。这是一些执行此操作的本机代码。这段代码当然应该从安装程序中执行,因为它需要管理员权限。

    编辑:糟糕!我才意识到我从这个前SO question 那里得到了代码。

    #include <aclapi.h>
    
    BOOL CreateDirectoryWithUserFullControlACL(LPCTSTR lpPath) 
    {
      // Create directory
      if (!CreateDirectory(lpPath,NULL))
        return FALSE;
    
      // Open directory object
      HANDLE hDir = CreateFile(lpPath,READ_CONTROL|WRITE_DAC,0,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
      if (hDir == INVALID_HANDLE_VALUE)
        return FALSE;
    
      // Get current security info for the directory
      ACL* pOldDACL;
      SECURITY_DESCRIPTOR* pSD = NULL;
      GetSecurityInfo(hDir, SE_FILE_OBJECT , DACL_SECURITY_INFORMATION,NULL, NULL, &pOldDACL, NULL, (void**)&pSD);
    
      // Create SID for Users
      PSID pSid = NULL;
      SID_IDENTIFIER_AUTHORITY authNt = SECURITY_NT_AUTHORITY;
      AllocateAndInitializeSid(&authNt,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_USERS,0,0,0,0,0,0,&pSid);
    
      // Create Full Access descriptor for Users
      EXPLICIT_ACCESS ea={0};
      ea.grfAccessMode = GRANT_ACCESS;
      ea.grfAccessPermissions = GENERIC_ALL;
      ea.grfInheritance = CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE;
      ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
      ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
      ea.Trustee.ptstrName = (LPTSTR)pSid;
    
      // Add Users' full access descriptor to the current permissions list of the directory
      ACL* pNewDACL = 0;
      DWORD err = SetEntriesInAcl(1,&ea,pOldDACL,&pNewDACL);
      if (pNewDACL!=NULL)
        SetSecurityInfo(hDir,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL, NULL, pNewDACL, NULL);
    
      // Clean up resources
      FreeSid(pSid);
      LocalFree(pNewDACL);
      LocalFree(pSD);
      LocalFree(pOldDACL);
      CloseHandle(hDir);
    
      return TRUE;
    }
    

    【讨论】:

    • 我如何在每个人的开始菜单/桌面上获取程序?也许我应该把它分成两个问题。
    • 约翰,这确实是一个不同的问题。 This other question/answer 应该有帮助。
    • 我建议将只读应用程序数据保存在 ProgramData 目录而不是 Program Files 中。但是,如果您希望所有用户都能够在那里修改数据,则必须更改默认权限。
    • @John 只需将快捷方式放入所有用户桌面和开始菜单即可。请务必使用 API 函数来获取路径,而不是硬编码。
    • 你能提供一个链接或解释如何做到这一点吗?我在安装程序文件系统位置中看不到这些选项。
    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多