c# - 如何在使用 .NET 安装期间授予文件夹读/写权限

标签 c# .net windows-installer file-permissions

我有一个使用 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/

相关文章:

c# - 在与角色 Controller /C# 发生碰撞时更改立方体的颜色

.net - 编译 VB.NET 代码时出现 "...ambiguous in the namespace..."错误

.net - C# 项目引用设置 SpecificVersion = False 似乎不起作用

windows - 带 Electron 链接的msi安装程序

visual-studio - 没有添加/删除条目的 Visual Studio 安装项目 MSI

c# - 使用 AutoGenerateColumns 更改 DataGridViewColumn 的类型

c# - C#程序可以以 '{'开头吗?如果没有,为什么不呢?

c# - Service Fabric RunAsync(CancellationToken cancellationToken) 没有被取消

c# - 犀牛模拟 : Mocking private method calls c#

.net - 创建 .NET Windows 服务安装程序的最佳方法是什么?