活动目录 - 跨域

时间:2016-09-19 13:29:05

标签: active-directory

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

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

域名A \ User1 > 域名A \全球集团>看不到:域B \ Local Group

但是当我从域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 { }
    }

}

1 个答案:

答案 0 :(得分:1)

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

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

此外,您可能还需要处理一些外部可信域。

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

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