1

Active Directoryが正しく設定されていると仮定して、2人が同じ場所にいるかどうかを判断する方法を見つけようとしています。私が頭を包むことができた唯一の方法は、彼らのディレクトリエントリが同じOUにあるかどうかを判断する方法を見つけることです。だから現在、これは私が現時点で唾を吐いているものです:

private bool ComparePeople()
{
    var user1Guid = "aaa";
    var user2Guid = "bbb";
    var expr = @"CN=.*?,";
    var user1OU = Regex.Replace(GetUserDN(user1Guid), expr, string.Empty);
    var user2OU = Regex.Replace(GetUserDN(user2Guid), expr, string.Empty);
    return user1OU == user2OU;
}
private string GetUserDN(string userGuid)
{
    using(var entry = new DirectoryEntry(string.format("LDAP://<GUID={0}>", userGuid)))
    {   
        using(var search = new DirectorySearcher(entry))
        {
            search.PropertiesToAdd.Add("distinguishedName");
            var result = search.FindOne().GetDirectoryEntry();
            if(result != null && result.Properties["distinguishedName"].Count > 0)
            {
                return result.Properties["distinguishedName"].Value.ToString();
            }
            else return "";
        }
    }
}

これはまだテストしていませんが、うまくいくと思います。それは基本的にユーザーの識別名を見つけ、彼らのGUIDを与えます。次に、CNをDNから削除し、基本的にそのユーザーのディレクトリエントリ/OUへのパスを見つけます。ただし、少し複雑なようです。これを単純化するためのコメントや推奨事項はありますか?

4

1 に答える 1

1

私があなたを正しく理解しているなら、あなたは2つのユーザーアカウントが同じOU(組織単位)内にあるかどうかを調べようとしています-そうですか?

私がすることは、両方のユーザーアカウントのを読み取ることです。その親が一致する場合、それらは同じOUにあります。

.NET 3.5以降を使用している場合は、System.DirectoryServices.AccountManagement(S.DS.AM)名前空間を確認する必要があります。ここでそれについてすべて読んでください:

基本的に、ドメインコンテキストを定義して、AD内のユーザーやグループを簡単に見つけることができます。

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find a two users
UserPrincipal user1 = UserPrincipal.FindByIdentity(ctx, IdentityType.Guid, user1Guid);
UserPrincipal user2 = UserPrincipal.FindByIdentity(ctx, IdentityType.Guid, user2Guid);

if(user1 != null && user2 != null)
{
     DirectoryEntry dirEntry1 = user1.GetUnderlyingObject() as DirectoryEntry;
     DirectoryEntry dirEntry2 = user2.GetUnderlyingObject() as DirectoryEntry;

     // if both are OK, get the parents and compare their GUID
     if(dirEntry1 != null && dirEntry2 != null)
     {
         DirectoryEntry parent1 = dirEntry1.Parent;
         DirectoryEntry parent2 = dirEntry2.Parent;

         bool areInSameOU = (parent1.Guid == parent2.Guid);
     }
}

新しいS.DS.AMを使用すると、ADのユーザーやグループを簡単に操作できます。

于 2012-05-06T07:31:56.750 に答える