Active Directoryからユーザーのリストを取得するにはどうすればよいですか?ユーザー名、名、姓を取得する方法はありますか?これが使用された同様の投稿を見ました:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
私はActive Directoryで何もしたことがないので、完全に迷っています。どんな助けでも大歓迎です!
Active Directoryからユーザーのリストを取得するにはどうすればよいですか?ユーザー名、名、姓を取得する方法はありますか?これが使用された同様の投稿を見ました:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
私はActive Directoryで何もしたことがないので、完全に迷っています。どんな助けでも大歓迎です!
回答:
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以降で使用されます。
if (((UserPrincipal)result).EmailAddress != null)
結果をリストに追加する前に追加する必要がありました。
y個のアクティブなアカウントをフィルター処理する場合は、これをHarveyのコードに追加します。
UserPrincipal userPrin = new UserPrincipal(context);
userPrin.Enabled = true;
最初の使用後。それから加えて
searcher.QueryFilter = userPrin;
すべてを見つける前に。これでアクティブなものが得られます。
searcher.QueryFilter = userPrin;
初期化時にユーザープリンシパルをプリンシパルサーチャーに渡しているので、必要ではないと思いますが、それ以外の場合は、アクティブユーザーのみをフィルター処理するヒントに感謝します。
using (var searcher = new PrincipalSearcher(new UserPrincipal(context){ Enabled = true }))
Enabled
、最初に値があるかどうかをテストする必要があると思いました:if (userPrincipal.Enabled.HasValue)
確かにクレジットはここで@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());
}
}
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);