2016-09-19 197 views
0

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

在一种情况下,我无法看到本地组,该用户是在两个代码或在窗口 例如,AD:

域A \用户1>域A \环球集团>不要看到:域B \本地组

但是,当我从域BI期待看到:

分享>域B \本地组>域A \环球集团>看不到域A \用户1

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

更新

我曾尝试下面的代码。我仍然无法看到Domain 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

为了找回所有组用户属于你要查询一个全局编录在用户的成员资格整个森林的每个域(用户的tokenGroups属性将返回嵌套组也一样),然后删除重复组。

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

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

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

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

+0

谢谢德米特里。我会检查这一点。 – H20rider

+0

我无法找到用户在其他域中所属的组。任何想法如何做到这一点?顺便说一句,GetEffectiveRightsFromAcl将不起作用,因为我确实需要显示用户如何获得共享权限的路径 – H20rider

+0

只需在同一页上,请确认您做了以下操作:1.从域A连接到GC。绑定到来自域A的指定用户。3.查询它的tokenGroups属性。 4.从域B连接到GC。5.绑定到GC上域A的同一用户。 6.在此GC上查询此用户的tokenGroups属性 – oldovets