应用程序文件夹的权限

Vic*_*tor 1 c# permissions windows-installer visual-studio-2005

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

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

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

Kei*_*thS 5

如果您不能更改应用程序本身尝试读取/写入文件的位置,则可以使用以下选项:

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

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

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);
    }
Run Code Online (Sandbox Code Playgroud)