我有一个使用 Visual Studio 2005 创建的默认应用程序设置。安装我的应用程序后,它只能以管理员身份运行,因为某些文件被写入应用程序文件夹中。
我发现在 Visual Studio 2010 上,有一个属性可以更改应用程序文件夹内某些文件夹的此权限。
如何允许我的应用程序在应用程序文件夹中创建和编辑特定文件而不以管理员身份运行它?
我有一个使用 Visual Studio 2005 创建的默认应用程序设置。安装我的应用程序后,它只能以管理员身份运行,因为某些文件被写入应用程序文件夹中。
我发现在 Visual Studio 2010 上,有一个属性可以更改应用程序文件夹内某些文件夹的此权限。
如何允许我的应用程序在应用程序文件夹中创建和编辑特定文件而不以管理员身份运行它?
以下是您的选项,假设您无法更改应用程序本身尝试读取/写入文件的位置:
编辑:这是我编写的应用程序安装程序的自定义操作的一种方法,该应用程序具有类似的“旧版”应用程序,该应用程序必须从应用程序“主”目录的子文件夹中的配置文件中读取/写入数据。传入的 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);
}
不要向应用程序文件夹(在程序文件下)写入任何内容。而是使用用户的主文件夹,或者,如果您想编写与机器上所有用户相关的内容 - ProgramData。
编辑:
如果您无法更改应用程序代码,您仍应尽可能避免将程序数据文件放在 ProgramFiles 下。你还可以做一件事。您可以在 c:\ProgramData 下创建一个文件夹,然后从 C:\Program Files... 创建一个指向它的符号链接。这样,您的旧应用程序仍然可以在预期的位置找到数据。
您可以使用 Windows 资源管理器将 NTFS 文件夹权限手动更改为应用程序文件夹。但是,最佳做法是读取/写入不同的文件夹。