2016-09-19 13 views
0

開発者側の私の役割。私は、ユーザーがシェアにアクセスできるかどうかを確認するためにチェックしているアプリケーションがあります。アプリケーションでは、その共有上のグループをチェックします。それから私は、ユーザーがにあるすべてのグループを確認しActive Directory - クロスドメイン

を一つのケースでは、ユーザーがコードや窓例えば でADの両方にあるローカルグループを参照するIができません:。

ドメインAを\ User1の>ドメインA \グローバルグループ>参照してくださいしないでください。ドメインB \ローカルグループ

しかし、私は、ドメインBIから見たときに参照してください。

シェア>ドメインB \ローカルグループ>ドメインA \グローバルグループ>ドメインA \ User1の

が表示されない場合、私は、Windowsのツールで見ていけないので、正しく設定されていないいくつかのセキュリティ設定がありますまたはコード。

更新

私は、次のコードを試してみました。私はまだドメインB \ローカルグループを見ることができません。

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

すべてのグループのユーザーを取得するためには、あなたに属しているユーザーのメンバーシップのために、フォレスト全体の各ドメインに1つのグローバルカタログを照会する必要がある(ユーザーのtokenGroupsが同様にあなたにネストされたグループを返します属性)、その後、重複を削除グループ。

Active Directoryは、1つのクエリで1つの属性の5Kを超える値を返すことはできません。 ユーザーが10Kを超えるグループに所属している場合、ADは最初の5Kのみを返します。その場合のメンバーシップを照会するには、範囲検索と呼ばれる手法を使用する必要があります。

また、処理する必要のある外部の信頼されたドメインが存在することもあります。

その他の解決方法は、GetEffectiveRightsFromAcl関数を使用して、指定した共有の有効なユーザーアクセス許可を計算することです。 解決策は説明されていますhere

SE_OBJECT_TYPE.SE_LMSHAREとオブジェクトタイプを関数に渡す必要があることに注意してください。

+0

ありがとうドミトリー。私はこれをチェックします。 – H20rider

+0

ユーザーが他のドメインに属していたグループを見つけることができませんでした。どのようにこれを行うにはどのようなアイデア? Btw GetEffectiveRightsFromAclは、ユーザーに共有へのアクセス許可のパスを表示する必要があるため、機能しません。 – H20rider

+0

同じページにいるだけで、次のことを確認してください。1.ドメインAからGCに接続します。ドメインAから指定されたユーザーにバインドします。3.トークングループ属性を照会します。 4.ドメインBからGCに接続します。5.このGCのドメインAから同じユーザーにバインドします。 6.このGCでこのユーザーのtokenGroups属性を照会してください – oldovets