SecurityIdentifier.Translate(typeof(NTaccount))窃听?

时间:2013-02-06 13:27:15

标签: c# .net acl ntfs security-identifier

在进行从SID到NTAccount的转换时,我使用以下代码:

DirectorySecurity folder_sec = Directory.GetAccessControl("c:\\test", AccessControlSections.All);
AuthorizationRuleCollection rules = folder_sec.GetAccessRules(true, true, typeof(SecurityIdentifier));

foreach (FileSystemAccessRule rule in rules)
{
    SecurityIdentifier sid = new SecurityIdentifier(rule.IdentityReference.Value);
    IdentityReference name = sid.Translate(typeof(NTAccount));

    string output = name + " | " + sid.tostring();
}

是的我意识到你可以从NTAccount方法获得folder_sec.GetAccessRules,但我发现正在使用相同的SecurityIdentifier.Translate子程序并且会发生同样的错误。在一天结束时,ACL只是SID数组。

如果您有两个活动目录对象(组,用户等)具有完全相同的名称但位于两个单独的域(可信,而不是子域),则该错误是translate方法返回错误的NTAccount 。它最终在执行代码的机器所在的域中返回具有相同名称的NTAccount。从其他域中获取NTAccount与您网域中的其他对象共享同一名称的域名返回正常。

假设您在domain_frank中的计算机上有一个目录,这是ACL:

  • domain_frank \ IT小组
  • domain_bob \ IT小组
  • domain_frank \戴夫
  • domain_bob \泰德

如果你运行它,虽然output上面的代码看起来像:

domain_frank\IT Team | S-1-5-21-4000000000-4000000000-2000000000-28480
domain_frank\IT Team | S-1-5-21-1000000000-8000000000-3000000000-81912
domain_frank\Dave | S-1-5-21-4000000000-4000000000-2000000000-86875
domain_bob\Ted |  S-1-5-21-1000000000-8000000000-3000000000-96521

假设名为Dave的对象不在domain_bob中,而名为Ted的对象不在domain_frank中。但是如果查看SID,您可以清楚地看到域部分完全不同,因此您至少在SID中知道ACL中的正确对象。与查找有关的事情正在破裂。

我的结果是我必须编写自己的算法来查看SID并在SID所属的域上查找活动目录。非常非常缓慢,并且完全疼痛。

这是一个已知的错误,是否有一个令人满意的解决方案?

0 个答案:

没有答案