c# - 应用程序文件夹的权限

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

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

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

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

最佳答案

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

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

编辑:这是一个直接来 self 编写的应用程序的安装程序自定义操作的方法,该应用程序具有类似的“旧版”应用程序,它必须从配置文件中读取/写入数据应用程序“主”目录的子文件夹。传入的 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);
    }

关于c# - 应用程序文件夹的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12920000/

相关文章:

c# - 使用 JsonConvert 将 C# 中的 JSON 转换为对象

symfony - Symfony2 上的权限问题

vb.net - 在哪里控制 winform 右上角 "X"关闭按钮的行为?

sql - 如何从 Reporting Services 2005 的 Count() 函数中排除空值?

c# - 如何调试引用的 dll(有 pdb)

c# - 我如何确定添加 2 个数字是否涉及重组/结转或减去 2 个数字是否涉及借用?

c# - 如何使用 LINQ 知道周期集合中是否存在任何重叠

c# - 密码登录异步 MVC C#

android - 如何在android中的/system/etc/permissions中添加android.hardware.usb.host.xml

postgresql - 锁定 PostgreSQL 中的公共(public)组角色