1

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

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

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

4

3 回答 3

5

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

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

编辑:这是我编写的应用程序安装程序的自定义操作的一种方法,该应用程序具有类似的“旧版”应用程序,该应用程序必须从应用程序“主”目录的子文件夹中的配置文件中读取/写入数据。传入的 IDictionary 是您从各种自定义操作方法(OnBeforeInstall、OnAfterInstall、OnCommit 等)中获得的,因此您只需将其放入 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);
    }
于 2012-10-16T17:51:03.047 回答
0

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

编辑:

如果您无法更改应用程序代码,您仍应尽可能避免将程序数据文件放在 ProgramFiles 下。你还可以做一件事。您可以在 c:\ProgramData 下创建一个文件夹,然后从 C:\Program Files... 创建一个指向它的符号链接。这样,您的旧应用程序仍然可以在预期的位置找到数据。

于 2012-10-16T17:13:48.697 回答
0

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

于 2012-10-16T17:14:38.710 回答