应用程序文件夹的权限

时间:2012-10-16 17:10:35

标签: c# permissions visual-studio-2005 windows-installer

我有一个使用Visual Studio 2005创建的默认应用程序设置。安装我的应用程序后,它只能以管理员身份运行,因为某些文件是在应用程序文件夹中编写的。

我发现在Visual Studio 2010上有一个属性可以在应用程序文件夹中的某些文件夹上更改此权限。

如何允许我的应用程序在应用程序文件夹中创建和编辑特定文件而不以管理员身份运行?

3 个答案:

答案 0 :(得分:4)

以下是您的选择,假设您无法更改应用程序本身尝试读取/写入文件的位置:

  • 更改应用程序安装程序的默认安装目录,而不是进入C:\ ProgramFiles,而是更改为具有更宽松访问权限的C:\驱动器之外的文件夹。这是Windows 3.1甚至Windows 95中的标准做法,但是现在您无法将Microsoft“认证”的程序与任何受支持的Windows版本兼容,除非它安装到正确的Program Files目录中。这些现代操作系统也将C:\驱动器的根目录锁定得非常紧,因此您需要管理权限才能安装应用程序(但不能运行它)。
  • 为安装程序创建自定义操作,以在安装期间增加程序子文件夹的访问权限。同样,如果你这样做,微软不太可能认证该应用程序,这也需要管理员权限来安装应用程序,这意味着网络上的普通用户不能只是将其拉下并运行它。
  • 安装必须在“正确”位置更改的文件(用户特定文件的应用程序数据,与整个软件有关的文件的程序数据),然后在主应用程序文件夹中创建指向的软件快捷方式他们可访问的位置的文件。遗留应用程序应该不知道区别。

编辑:这是一个直接来自我编写的应用程序的自定义操作的方法,该应用程序具有类似的“遗留”应用程序,该应用程序必须从配置文件读取/写入数据应用程序“home”目录的子文件夹。传入的IDictionary是您从各种自定义操作方法(OnBeforeInstall,OnAfterInstall,OnCommit等)获得的IDictionary,因此您只需将其放入Installer类,从处理程序中为您选择的安装事件调用它(必须在安装程序完成文件系统更改后,并调用它:

private void SetEditablePermissionOnConfigFilesFolder(IDictionary savedState)
    {
        if (!Context.Parameters.ContainsKey("installpath")) return;

        //Get the "home" directory of the application
        var path = Path.GetFullPath(Context.Parameters["installpath"]);

        //in my case the necessary files are under a ConfigFiles folder;
        //you can do something similar with individual files
        path = Path.Combine(path, "ConfigFiles");
        var dirInfo = new DirectoryInfo(path);

        var accessControl = dirInfo.GetAccessControl();

        //Give every user of the local machine rights to modify all files
        //and subfolders in the directory
        var userGroup = new NTAccount("BUILTIN\\Users");
        var userIdentityReference = userGroup.Translate(typeof(SecurityIdentifier));

        accessControl.SetAccessRule(
            new FileSystemAccessRule(userIdentityReference,
                                     FileSystemRights.Modify,
                                     InheritanceFlags.ObjectInherit 
                                        | InheritanceFlags.ContainerInherit,
                                     PropagationFlags.None,
                                     AccessControlType.Allow));
        //Commit the changes.
        dirInfo.SetAccessControl(accessControl);
    }

答案 1 :(得分:0)

不要向应用程序文件夹(程序文件下)写任何内容。而是使用用户的主文件夹,或者,如果你想写一些与机器上所有用户相关的东西 - ProgramData。

编辑:

如果您无法更改应用程序代码,则应尽可能避免将程序数据文件放在ProgramFiles下。还有一件事你可以做。您可以在c:\ ProgramData下创建一个文件夹,只需从C:\ Program Files ...创建一个符号链接即可。这样,您的遗留应用程序仍然可以找到它希望找到它的数据。

答案 2 :(得分:0)

您可以使用Windows资源管理器手动将NTFS文件夹权限更改为应用程序文件夹。但是,最佳做法是读/写不同的文件夹。