为所有用户设置c:\ program files \ company \ app \ file的文件权限

时间:2011-11-10 01:23:38

标签: c# windows-services file-security

我有一个工作正常的自定义安装程序,但每次更新应用程序时都要求用户获得管理员权限。我正在创建一个跳过此部分的Windows服务,但Windows服务仅向该文件授予系统和管理员权限,并且用户无法执行新的更新。

要纠正这个我正在尝试(在文件下载/安装到正确的位置之后(从Windows服务中,它有帐户ServiceAccount.LocalSystem),

FileSecurity access = file.GetAccessControl();
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
access.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.ReadAndExecute, AccessControlType.Allow));

但设置无效。我该怎么办?

2 个答案:

答案 0 :(得分:4)

我明白了。我只需要打电话,

file.SetAccessControl(access);

以上之后。显然,file.GetAccessControl会传回访问控制的副本,而不是控制文件文件权限的副本,直到您使用修改后的权限调用file.SetAccessControl。

我在另一个文件中发现了另一个警告,该服务是在c:\ ProgramData中创建的,

  • 是必须在写入文件后发生该集合。预先将该集应用于该文件是无效的。

答案 1 :(得分:3)

我最近在从网络加载文件时遇到了问题,并希望能够在测试中重新创建错误并遇到同样的问题。

我提出了以下小课程来帮助它,因为用于完成这些工作的API非常糟糕且充满了一点陷阱:

public class PermissionController
{
    private readonly string _file;
    private readonly FileSecurity _accessControl;
    private readonly SecurityIdentifier _id;
    private readonly List<FileSystemAccessRule> _permissionsDenied;

    public PermissionController(string file)
    {
        _file = file;
        _accessControl = File.GetAccessControl(_file);
        _id = WindowsIdentity.GetCurrent().Owner;
        _permissionsDenied = new List<FileSystemAccessRule>();
    }

    public void Allow(params FileSystemRights[] rights)
    {
        foreach (var right in rights)
            AddRule(Rule(right, AccessControlType.Allow));
    }

    public void Deny(params FileSystemRights[] rights)
    {
        foreach (var right in rights)
        {
            var rule = Rule(right, AccessControlType.Deny);
            AddRule(rule);
            _permissionsDenied.Add(rule);
        }
    }

    private void AddRule(FileSystemAccessRule rule)
    {
        _accessControl.AddAccessRule(rule);
    }

    private FileSystemAccessRule Rule(FileSystemRights right, AccessControlType type)
    {
        return new FileSystemAccessRule(_id, right, type);
    }

    public void RemoveDeniedPermissions()
    {
        foreach (var rule in _permissionsDenied)
            _accessControl.RemoveAccessRule(rule);

        Apply();
    }

    public void Apply()
    {
        File.SetAccessControl(_file,_accessControl);
    }
}

调用代码如下:

        _permissionController = new PermissionController(_file);
        _permissionController.Allow(FileSystemRights.Read, FileSystemRights.Write);
        _permissionController.Deny(FileSystemRights.FullControl,
                                   FileSystemRights.Modify,
                                   FileSystemRights.ReadAndExecute);
        _permissionController.Apply();

其中_file是完全限定的路径。

你需要小心打电话

添加/删除规则后的File.SetAccessControl,否则无效。

除非我误解了API,否则您必须为每个权限添加一条规则,因为FileSystemRights枚举不使用标记。

您还需要小心谨慎,因为允许您拒绝的权利并不等同于删除拒绝该权利的规则。似乎被拒绝的权利超越了允许的权利。

您可以通过查看Windows资源管理器中文件属性的安全选项卡来观察结果。