【问题标题】:Active Directory - Cross DomainsActive Directory - 跨域
【发布时间】:2017-01-27 05:14:58
【问题描述】:

我在开发人员方面的角色。我有一个应用程序,我正在尝试检查用户是否有权访问共享。在应用程序中,我检查了该共享上的组。然后我检查用户所在的所有组。

在一种情况下,我无法看到用户在代码中的本地组或 Windows 中的 AD 例如:

域 A\User1 > 域 A\全局组 > 看不到:域 B\本地组

但是当我从域 B 看时,我看到了:

分享 > 域 B\本地组 > 域 A\全局组 > 看不到 域 A\User1强>

是否有一些安全设置没有正确设置,因为我在 windows 工具或代码中没有看到。

更新

我已经尝试了以下代码。我仍然看不到域 B\Local Group

string account = "{User**Or**Group}";
string domain = "{Domain}";

string dn = ADHelper.GetDistinguishedName(domain, account);

using (var forest = Forest.GetCurrentForest())
{
          foreach (Domain domainName in forest.Domains)
          {
               Console.WriteLine(string.Format("Domain: {0}", domainName.Name));
        Console.WriteLine("========================================================");
              GetAllGroups(dn, domainName.Name);
              domainName.Dispose();
          }
      }

void GetAllGroups(string dn, string domain)
{

    DirectorySearcher ds = new DirectorySearcher(string.Format("GC://{0}", domain));
    ds.Filter = String.Format("(&(distinguishedName={0}))", dn);

    SearchResult sr = ds.FindOne();

    if (sr == null)
        return; 
    DirectoryEntry Diruser = sr.GetDirectoryEntry();
    Diruser.RefreshCache(new string[] { "tokenGroups" });

    for (int i = 0; i < Diruser.Properties["tokenGroups"].Count; i++)
    {
        SecurityIdentifier sid = new SecurityIdentifier((byte[])Diruser.Properties["tokenGroups"][i], 0);
        try
        {
            NTAccount nt = (NTAccount)sid.Translate(typeof(NTAccount));
            Console.WriteLine(nt.Value + "\t" + domain);
        }
        catch { }
    }

}

【问题讨论】:

    标签: active-directory


    【解决方案1】:

    为了检索用户所属的所有组,您必须在整个林的每个域中查询一个全局目录以获取用户的成员资格(用户的 tokenGroups 属性也会返回嵌套组),然后删除重复的组。

    请注意,Active Directory 不能在一个查询中返回超过 5K 的单个属性值。 如果用户属于超过 10K 的组,那么 AD 将只返回前 5K。在这种情况下,您必须使用称为范围检索的技术来查询成员资格。

    此外,您可能还必须处理一些外部可信域。

    其他解决方案是使用 GetEffectiveRightsFromAcl 函数计算指定共享的有效用户权限。 解决方案描述here

    请注意,您需要将 SE_OBJECT_TYPE.SE_LMSHARE 作为对象类型传递给函数。

    【讨论】:

    • 谢谢德米特里。我会检查一下。
    • 我无法在其他域中找到该用户所属的组。任何想法如何做到这一点?顺便说一句,GetEffectiveRightsFromAcl 将不起作用,因为我确实需要显示用户如何获得共享权限的路径
    • 为了在同一页面上,请确认您执行了以下操作: 1. 从域 A 连接到 GC。 2. 绑定到域 A 中的指定用户。 3. 查询它的 tokenGroups 属性。 4. 从域 B 连接到 GC。 5. 在此 GC 上绑定到域 A 的同一用户。 6.在本次GC上查询该用户的tokenGroups属性
    • 当然,您必须通过删除重复项将两个 GC 的成员资格合并为一个成员。来自域 A 的 GC 将返回用户属于域 A 的本地安全组,来自域 B 的 GC 将返回您来自域 B 的用户本地安全组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多