Active Directoryからユーザーのリストを取得するにはどうすればよいですか?


109

Active Directoryからユーザーのリストを取得するにはどうすればよいですか?ユーザー名、名、姓を取得する方法はありますか?これが使用された同様の投稿を見ました:

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");

私はActive Directoryで何もしたことがないので、完全に迷っています。どんな助けでも大歓迎です!


3
優れたMSDNの記事「.NET Framework 3.5でのディレクトリセキュリティプリンシパルの管理」を読んで、ADを.NET 3.5で使用するための優れた
入門

@のmarc_sの記事のように見えますが、ここだ、アーカイブされました更新されたリンク
JBを。

@marc_s私は先生を読みたいですが、リンクは死んだものです。私はこの試みたblogs.msdn.microsoft.com/msdnmagazine/2008/01/16/...をしかし、Microsoft雑誌のための遺伝のページへの記事のリード上にもリンク
マルコム・サルバドル

1
@ Malky.Kid私は記事への道を見つけました。この質問への最初のコメントのリンクを使用して、2008年1月号をダウンロードしてください。読む前に、エクスプローラのプロパティページでchm-fileのブロックを解除することを忘れないでください。
OneWorld 2018

回答:


229

Active Directoryを初めて使用する場合は、Active Directoryが最初にデータを格納する方法を理解しておくことをお勧めします。

Active Directoryは実際にはLDAPサーバーです。LDAPサーバーに格納されているオブジェクトは階層的に格納されます。ファイルシステムにファイルを保存するのとよく似ています。そのため、ディレクトリサーバーとActive Directoryという名前が付けられました。

Active Directory上のコンテナとオブジェクトは、で指定できますdistinguished name。識別名はこんな感じCN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=comです。従来のリレーショナルデータベースと同様に、LDAPサーバーに対してクエリを実行できます。これはLDAPクエリと呼ばれます。

.NETでLDAPクエリを実行する方法はいくつかあります。DirectorySearcher from System.DirectoryServicesまたはSearchRequest fromを使用できますSystem.DirectoryServices.Protocol

あなたは、特にユーザープリンシパルオブジェクトを見つけるために求めているので、あなたの質問については、私が最も直感的な方法を使用することだと思うPrincipalSearcherをからSystem.DirectoryServices.AccountManagement。あなたは簡単にグーグルから多くの異なる例を見つけることができます。ここにあなたが求めていることを正確に行っているサンプルがあります。

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (var result in searcher.FindAll())
        {
            DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
            Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
            Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
            Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
            Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

ADユーザーオブジェクトには、いくつかの属性があることに注意してください。具体的には、givenNameあなたを与えるだろうFirst Nameし、snあなたを与えるだろうLast Name。ユーザー名について。ユーザーのログオン名を意味していると思います。ADユーザーオブジェクトには2つのログオン名があることに注意してください。1つはsamAccountNameであり、Windows 2000以前のユーザーログオン名としても知られています。 userPrincipalName通常、Windows 2000以降で使用されます。


2
サーバーにドメインが含まれていない場合

同じコードを使用して、ADグループのユーザーをどのようにリストしますか?
nJoshi 2015

この方法を使用して、メールアドレスが割り当てられているディレクトリ内の検索のみに絞り込む方法はありますか?
ARidder101 2017

気にしないで、私はそれを理解しました。if (((UserPrincipal)result).EmailAddress != null)結果をリストに追加する前に追加する必要がありました。
ARidder101 2017

2
また、現在のコンピュータがドメインに属していない場合はどうなりますか?
マーカス

23

y個のアクティブなアカウントをフィルター処理する場合は、これをHarveyのコードに追加します。

 UserPrincipal userPrin = new UserPrincipal(context);
 userPrin.Enabled = true;

最初の使用後。それから加えて

  searcher.QueryFilter = userPrin;

すべてを見つける前に。これでアクティブなものが得られます。


searcher.QueryFilter = userPrin;初期化時にユーザープリンシパルをプリンシパルサーチャーに渡しているので、必要ではないと思いますが、それ以外の場合は、アクティブユーザーのみをフィルター処理するヒントに感謝します。
Andrey

1
うん、アンドレイは、ステートメントを使用して、第2に、このプロパティを追加することで、右だから、基本的にこれを交換することができます:using (var searcher = new PrincipalSearcher(new UserPrincipal(context){ Enabled = true }))
マルコJovanov

しかしEnabled、最初に値があるかどうかをテストする必要があると思いました:if (userPrincipal.Enabled.HasValue)
JohnB

4

確かにクレジットはここで@Harvey Kwokに送られますが、私の例では実際のUserPrincipalsのリストを取得したかったので、この例を追加したかっただけです。このクエリを事前にフィルタリングする方がおそらく効率的ですが、私の小さな環境では、すべてをプルして、後で必要に応じてリストからフィルタリングする方が簡単です。

必要なものによっては、DirectoryEntryにキャストする必要はないかもしれませんが、UserPrincipalから利用できないプロパティもあります。

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName))))
{
    List<UserPrincipal> users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList();
    foreach(var u in users)
        {
            DirectoryEntry d = (DirectoryEntry)u.GetUnderlyingObject();
            Console.WriteLine(d.Properties["GivenName"]?.Value?.ToString() + d.Properties["sn"]?.Value?.ToString());
        }
}

「e」って何?
Fandango68

1
ありがとう、気づかなかった。私はそれを変えました、「u」であるはずでした。プロパティがない場合にnull値を処理するために?sも追加しました。
ジョーダン

1

System.DirectoryServices.dllをインクルードし、次のコードを使用します。

DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);
string userNames="Users: ";

foreach (DirectoryEntry child in directoryEntry.Children)
{
    if (child.SchemaClassName == "User")
    {
        userNames += child.Name + Environment.NewLine   ;         
    }

}
MessageBox.Show(userNames);

1
@ Fandango68:LOL、そうです!!! System.Windows.Forms.MessageBox.Show(ex.Message + ex.StackTrace);
ジョルマン2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.