12

ActiveDirectory へのインターフェイスとして、.Net ライブラリの System.DirectoryServices.AccountManagement 部分を使用しています。

GroupPrincipal オブジェクトで GetMembers() を呼び出して結果をフィルター処理すると、UserPrincipal オブジェクトのコレクションができました。

GroupPrincipal myGroup;  // population of this object omitted here 

foreach (UserPrincipal user in myGroup.GetMembers(false).OfType<UserPrincipal>())
{
    Console.WriteLine(user.SamAccountName);
}

上記のコード サンプルは、「TestUser1」のようなユーザー名を出力します。これらを「DOMAIN\TestUser1」形式の別のアプリケーションからのリストと比較する必要があります。

UserPrincipal オブジェクトから "DOMAIN" 部分を取得するにはどうすればよいですか?

複数のドメインが関係しているため、既知のドメイン名を追加することはできず、DOMAIN1\TestUser1 と DOMAIN2\TestUser2 を区別する必要があります。

4

5 に答える 5

4

私が考えることができる2つの選択肢があります。

  1. の権利を解析するか、すべてを取得しますname@fully.qualified.domain.name
  2. System.DirectoryServices名前空間を使用します。

UserPrincipalについても、GroupPrincipalについても知りません。一方、私はあなたが望むものを達成するための実用的な方法を知っています。

[TestCase("LDAP://fully.qualified.domain.name", "TestUser1")] 
public void GetNetBiosName(string ldapUrl, string login)
    string netBiosName = null;
    string foundLogin = null;

    using (DirectoryEntry root = new DirectoryEntry(ldapUrl))
        Using (DirectorySearcher searcher = new DirectorySearcher(root) {
            searcher.SearchScope = SearchScope.Subtree;
            searcher.PropertiesToLoad.Add("sAMAccountName");
            searcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", login);

            SearchResult result = null;

            try {
                result = searcher.FindOne();

                if (result == null) 
                    if (string.Equals(login, result.GetDirectoryEntry().Properties("sAMAccountName").Value)) 
                        foundLogin = result.GetDirectoryEntry().Properties("sAMAccountName").Value
            } finally {
                searcher.Dispose();
                root.Dispose();
                if (result != null) result = null;
            }
        }

    if (!string.IsNullOrEmpty(foundLogin)) 
        using (DirectoryEntry root = new DirectoryEntry(ldapUrl.Insert(7, "CN=Partitions,CN=Configuration,DC=").Replace(".", ",DC=")) 
            Using DirectorySearcher searcher = new DirectorySearcher(root)
                searcher.Filter = "nETBIOSName=*";
                searcher.PropertiesToLoad.Add("cn");

                SearchResultCollection results = null;

                try {
                    results = searcher.FindAll();

                    if (results != null && results.Count > 0 && results[0] != null) {
                        ResultPropertyValueCollection values = results[0].Properties("cn");
                        netBiosName = rpvc[0].ToString();
                } finally {
                    searcher.Dispose();
                    root.Dispose();

                    if (results != null) {
                        results.Dispose();
                        results = null;
                    }
                }
            }

    Assert.AreEqual("INTRA\TESTUSER1", string.Concat(netBiosName, "\", foundLogin).ToUpperInvariant())
}

このSOの質問で利用可能な他の関連情報またはリンク。
C#Active Directory:ユーザーのドメイン名を取得しますか?
ドメインのNetBIOS名を見つける方法

于 2010-11-26T14:35:18.350 に答える
2

ActiveDs COM ライブラリを使用します。名前変換が組み込まれており、機能し、仮定を行いません (ここの他の回答のように)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ActiveDs;

namespace Foo.Repository.AdUserProfile
{
    public class ADUserProfileValueTranslate
    {
        public static string ConvertUserPrincipalNameToNetBiosName(string userPrincipleName)
        {
            NameTranslate nameTranslate = new NameTranslate();
            nameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME, userPrincipleName);
            return nameTranslate.Get((int) ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4);
        }
    }
}
于 2011-06-05T14:27:10.740 に答える
0

user.DistinguishedName プロパティで可能なドメインを探すことができます。ドメイン 1 のユーザーには、文字列「DC=DOMAIN1」が含まれている必要があります。「DC=DOMAIN2」という文字列を含めるべきではありません。

于 2012-08-20T16:21:51.890 に答える
-1

完全修飾ドメイン名をこの別のアプリに渡してみましたか? そうすれば、ほとんどの Windows API は文句を言いませんfully_qualified_domain\USER

于 2010-11-26T14:15:30.973 に答える