【问题标题】:How to manage folders permissions on Mac OS with ACL in .NET Core 3.1.0如何在 .NET Core 3.1.0 中使用 ACL 在 Mac OS 上管理文件夹权限
【发布时间】:2020-07-21 23:05:33
【问题描述】:

我在 C# 中有以下代码:

if (!Directory.Exists(inputFolder))
        {
            return true;
        }
        else
        {
            var me = new DirectoryInfo(inputFolder);

            AuthorizationRuleCollection rules = null;
            WindowsIdentity identity = null;
            try
            {
                rules = me.GetAccessControl().GetAccessRules(true, true, typeof(SecurityIdentifier));
                identity = WindowsIdentity.GetCurrent();
            }
            catch (UnauthorizedAccessException uae)
            {
                return false;
            }

            string userSID = identity.User.Value;

            foreach (FileSystemAccessRule rule in rules)
            {
                if ((rule.FileSystemRights.HasFlag(FileSystemRights.Read) ||
                    rule.FileSystemRights.HasFlag(FileSystemRights.ReadAttributes) ||
                    rule.FileSystemRights.HasFlag(FileSystemRights.ReadData) ||
                    rule.FileSystemRights.HasFlag(FileSystemRights.ReadAndExecute)) && rule.AccessControlType == AccessControlType.Deny)
                {
                    return false;
                }
            }

            return true;
        }

它在 Windows 中可以正常工作,但是,当我尝试在 mac OS X (Visual Studio for Mac) 上运行它时,它会在尝试从方法“GetAccessRules”甚至“GetAccessControl”获取信息时引发异常说:

“访问控制列表 (ACL) API 是 Windows 资源管理的一部分,在此平台上不受支持。”

所以这是我的问题:

在 .net 核心中是否有替代方法?或者我应该如何在 .net core 但在 mac OS X 中管理这些权限?

【问题讨论】:

  • 如果您想分享您的问题的解决方案,您应该将其发布为答案 - 因为它就是这样 - 而不是将其编辑到问题中。请参阅Can I answer my own question?,简而言之,答案是“是的!”
  • 这是我的第一个问题,所以我不知道。我将按照标准进行编辑。谢谢培根!

标签: c# .net macos .net-core acl


【解决方案1】:

我假设您正在使用System.IO.FileSystem.AccessControl 使GetAccessControl().NET Core 上工作?不幸的是,这些 API 与 Windows 低级 API 紧密相关,无法在 Unix/Linux 系统上运行。

但是,还有另一种选择。你可以试试Mono.Posix.NETStandard。这是Nuget 链接。

您可以调用UnixDirectoryInfo() 并通过这种方式获取或设置FileAccessPermissions

【讨论】:

  • 嗨!实际上我最终使用了微软“Mono.Posix.NETStandard”提供的那个库。谢谢!
  • 我会编辑我的答案,以防其他人遇到同样的问题
【解决方案2】:

更新

我找到了解决方案,与上述答案中 Ruv 提供的相同。

因此,安装 Nuget 包 Mono.Posix.NETStandard 可以正常工作。只需获取目录/文件的信息: var unixDirInfo = new Mono.Unix.UnixDirectoryInfo('path');

然后你可以像这样检查权限:

    unixDirInfo.canAccess(AccessModes.F_OK) // is a file or directory
    unixDirInfo.canAccess(AccessModes.R_OK) // accessible for reading
    unixDirInfo.canAccess(AccessModes.W_OK) // accessible for writing
    unixDirInfo.canAccess(AccessModes.X_OK) // accessible for executing

或来自 FileAccessPermissions:

    FileAccessPermissions permissions = unixDirInfo.FileAccessPermissions;
    permissions.HasFlag(FileAccessPermissions.UserRead);
    permissions.HasFlag(FileAccessPermissions.UserWrite);
    permissions.HasFlag(FileAccessPermissions.UserExecute);
    permissions.HasFlag(FileAccessPermissions.UserExecute .UserReadWriteExecute);

您可以查看 FileAccessPermission 枚举以获取更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 2017-12-21
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多