2016-09-19 134 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