【问题标题】:Getting local group from mapped drives c#从映射驱动器 c# 获取本地组
【发布时间】:2020-06-11 12:02:42
【问题描述】:

我们正面临从 C# 授予对映射路径的文件夹访问权限的问题。我们有一个地图驱动器,它使用代码进行映射。它工作正常,我们尝试使用以下代码授予访问权限。

DirectorySecurity dirSec = Directory.GetAccessControl(clientFolder);
dirSec.AddAccessRule(new FileSystemAccessRule(@"Local group Name", FileSystemRights.Modify, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));

添加 AddAccessRule 时出错。

错误:

Some or all identity references could not be translated.

追踪:

 at System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, Boolean forceSuccess)
   at System.Security.Principal.NTAccount.Translate(Type targetType)
   at System.Security.AccessControl.CommonObjectSecurity.ModifyAccess(AccessControlModification modification, AccessRule rule, Boolean& modified)
   at System.Security.AccessControl.CommonObjectSecurity.AddAccessRule(AccessRule rule)

注意:我们正在使用 AD 服务帐户来映射 NAS,并且我们正在尝试从父计算机添加本地组。 AD 无法访问此组,并且它是同一个域。

请给我任何想法,将本地服务帐户的访问权限授予 NAS。

【问题讨论】:

  • 似乎缺少一些信息,确实用于涉及网络使用的服务的正确帐户是网络服务而不是本地服务。但是,我多次看到遗留应用程序为了克服类似问题需要创建一个 AD 用户,即 ServiceMyProgramName 并将其设置在服务登录属性中,以便可以通过标准安全工具来管理您需要分配的所有内容权限或创建文件夹。
  • @P.Lion 需要授予本地组现有文件夹的访问权限。
  • 它没有像我们预期的那样工作:请您指定是否 1) AddAccessRule 是否返回任何错误? 2) AddAccessRule 执行后,如果您检查clientFolder 的安全性,您是否可以在权限列表中看到“本地组名称”? 3)它是否像阅读一样工作? 4)这个共享文件夹包括共享级别权限内的所有人读写?我的意思不是文件一,而是在服务器或NAS上的共享/ smb服务级别设置的权限;事实上,即使您在文件级别向“LocalGroup”写入,但共享状态“每个人”都已阅读
  • @P.Lion 更新了上面的问题,请看一下
  • 该错误可能是由于组引用不正确,请确保您正确提供领域,它应该包括服务器名称,即“SVRNAS01\LocalGroup” 最终尝试查看域和内置有效组被正确接受,最好在客户端文件夹内的新测试子文件夹中。即“DOMAINNAME\DomainGroup”、“BUILTIN\Administrators”、“BUILTIN\Users”

标签: c# directory active-directory nas


【解决方案1】:

我们手动将该组添加到一个文件夹,并将 IdentityReference.Value 存储到一个变量中。然后我们很容易得到 IdentityReference,使用它我们将程序添加到其他文件夹。下面的代码用于获取 IdentityReference

        public IdentityReference getReference(string NameOfDirectory)
        {
            DirectorySecurity dirSec = Directory.GetAccessControl(NameOfDirectory);
            AuthorizationRuleCollection accessRules;
            IdentityReference identity = null;
            accessRules = dirSec.GetAccessRules(true, true, typeof(NTAccount));
            foreach (FileSystemAccessRule rule in accessRules)
            {
                if (identity == null)
                {
                    if (rule.IdentityReference.Value != null && rule.IdentityReference.Value.Equals(Constants.securityId))
                    {
                        dirSec.RemoveAccessRuleSpecific(rule);
                        identity = rule.IdentityReference;
                        break;
                    }
                }
            }
            return identity;
        }

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多