我有一个使用 Visual Studio 2010 构建的安装项目。
安装程序在将应用程序及其所有依赖项安装到其正确的子目录和程序数据目录中方面工作正常。
但是,我注意到安装程序创建的每个目录(根文件夹及其所有子目录)都没有授予“写入”权限。添加到“用户”组目录的唯一权限是:
- 阅读并执行
- 列出文件夹内容
- 阅读
无论用户是否以“管理员”身份安装应用程序,这种明显的默认权限设置都会发生。
令我感到奇怪的是,安装程序没有为正在安装的应用程序使用的文件夹授予“写入”权限 - 更令人困惑的是,安装程序在 中创建的文件夹应用程序数据库的 ProgramData
文件夹未获得“写入”权限。
我的问题是,是否有一种方法可以配置安装项目,以便在创建文件夹时以及何时创建文件夹,我们可以告诉它要授予什么类型的权限以及授予谁。就我而言,我需要为(应用程序的)根目录及其所有子目录,以及放置在 ProgramData
文件夹中的文件夹授予“用户组”的“读/写”权限”。从技术上讲,我很乐意将目录“完全控制”授予“用户组”。
最佳答案
我想我的另一篇文章因为过于笼统而被删除了,所以我在下面对其进行了改进:
要做的事情是进行自定义操作。这非常简单,请查看编写 C# 自定义操作的 MSDN 演练 here .您会将更改权限的代码放在 Install 方法中:
按照链接中的前几个步骤获取从您的安装程序解决方案中引用的新安装程序项目。你必须这样做,这样你就可以构建一个在安装结束时调用的 dll。
实际上为用户设置读/写权限有点棘手,我能得到的最接近的是为经过身份验证的用户设置。我拼凑了一些我在 Internet 上找到的其他解决方案来提出这个问题:
public override void Install(IDictionary stateSaver)
{
// This gets the named parameters passed in from your custom action
string folder = Context.Parameters["folder"];
// This gets the "Authenticated Users" group, no matter what it's called
SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null);
// Create the rules
FileSystemAccessRule writerule = new FileSystemAccessRule(sid, FileSystemRights.Write, AccessControlType.Allow);
if (!string.IsNullOrEmpty(folder) && Directory.Exists(folder))
{
// Get your file's ACL
DirectorySecurity fsecurity = Directory.GetAccessControl(folder);
// Add the new rule to the ACL
fsecurity.AddAccessRule(writerule);
// Set the ACL back to the file
Directory.SetAccessControl(folder, fsecurity);
}
// Explicitly call the overriden method to properly return control to the installer
base.Install(stateSaver);
}
然后,当您创建自定义操作时,编辑其属性,并在 CustomActionData 属性下添加如下内容:
/folder="[CommonAppDataFolder][ProductName]"
关于c# - 如何在使用 .NET 安装期间授予文件夹读/写权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7288444/