の方法については説明しませんでしたそれらを実装するために、そしてほとんどが間違ったフィルタプロパティを与えました。 .Filter
を使用する必要はありません。UserPrincipal
オブジェクトにプロパティ(姓:.Surname
、名:= .GivenName
)を割り当ててから、検索をトリガーするイベントが発生した場合でもPrincipalSearcher
を使用してそのオブジェクトを検索します。
string firstName = txtFirstName.Text;
string lastName = txtLastName.Text;
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
UserPrincipal up = new UserPrincipal(ctx);
if (!String.IsNullOrEmpty(firstName))
up.GivenName = firstName;
if (!String.IsNullOrEmpty(lastName))
up.Surname = lastName;
PrincipalSearcher srch = new PrincipalSearcher(up);
srch.QueryFilter = up;
私はtxtFirstName
とtxtLastName
のIDS /名称で、あなたはそれを得るために最初と最後の名前のためのテキストボックスを持っていると仮定しています。探しているプロパティに値がない場合は、UserPrincipal
に値を加えないでください。そうしないと例外が発生します。それが上記のチェックの理由です。結果はその.Count()
が0
で、なぜ両方のチェックがされている場合でも、nullにならないことを
using (PrincipalSearchResult<Principal> results = srch.FindAll())
{
if (results != null)
{
int resultCount = results.Count();
if (resultCount > 0) // we have results
{
foreach (Principal found in results)
{
string username = found.SamAccountName; // Note, this is not the full user ID! It does not include the domain.
}
}
}
}
注:
その後、Principal
オブジェクトのPrincipalSearchResult
コレクションに検索結果を取得するためにsrch
に.FindAll
を行いますそこ。
あなたが必要なプロパティを取得するためにforeach
ことを利用して反復し、これはC#を使用してADでユーザーを見つける方法の質問に答える、しかし、あなただけPrincipal
オブジェクトを使用していくつかのプロパティを取得することができます注意してください、と私の場合Googleを介してこの質問に達した(私がしたように)、私は非常に心配するだろう。あなたが必要とするものがすべて見つかった場合 - 偉大な、あなたは完了です!しかし、残りを得るために(そして自分の良心を休むために)、あなたは潜水しなければなりません。それをどうやって行うのかを説明します。
私はあなたがそれを使うことはできないことを発見しました。上記に入れましたが、DOMAIN\doej
種類の名前を取得する必要があります。これがあなたのやり方です。
string userId = GetUserIdFromPrincipal(found);
と、この機能を使用します:あなたは、この関数を呼び出すことができる、というたら
private static string GetUserIdFromPrincipal(Principal prin)
{
string upn = prin.UserPrincipalName;
string domain = upn.Split('@')[1];
domain = domain.Substring(0, domain.IndexOf(".YOURDOMAIN"));
// "domain" will be the subdomain the user belongs to.
// This may require edits depending on the organization.
return domain + @"\" + prin.SamAccountName;
}
を:代わりに、上記の、そのforeach
ループでこれを入れ
public static string[] GetUserProperties(string strUserName)
{
UserPrincipal up = GetUser(strUserName);
if (up != null)
{
string firstName = up.GivenName;
string lastName = up.Surname;
string middleInit = String.IsNullOrEmpty(up.MiddleName) ? "" : up.MiddleName.Substring(0, 1);
string email = up.EmailAddress;
string location = String.Empty;
string phone = String.Empty;
string office = String.Empty;
string dept = String.Empty;
DirectoryEntry de = (DirectoryEntry)up.GetUnderlyingObject();
DirectorySearcher ds = new DirectorySearcher(de);
ds.PropertiesToLoad.Add("l"); // city field, a.k.a location
ds.PropertiesToLoad.Add("telephonenumber");
ds.PropertiesToLoad.Add("department");
ds.PropertiesToLoad.Add("physicalDeliveryOfficeName");
SearchResultCollection results = ds.FindAll();
if (results != null && results.Count > 0)
{
ResultPropertyCollection rpc = results[0].Properties;
foreach (string rp in rpc.PropertyNames)
{
if (rp == "l") // this matches the "City" field in AD properties
location = rpc["l"][0].ToString();
if (rp == "telephonenumber")
phone = FormatPhoneNumber(rpc["telephonenumber"][0].ToString());
if (rp == "physicalDeliveryOfficeName")
office = rpc["physicalDeliveryOfficeName"][0].ToString();
if (rp == "department")
dept = rpc["department"][0].ToString();
}
}
string[] userProps = new string[10];
userProps[0] = strUserName;
userProps[1] = firstName;
userProps[2] = lastName;
userProps[3] = up.MiddleName;
userProps[4] = middleInit;
userProps[5] = email;
userProps[6] = location;
userProps[7] = phone;
userProps[8] = office;
userProps[9] = dept;
return userProps;
}
else
return null;
}
/// <summary>
/// Returns a UserPrincipal (AD) user object based on string userID being supplied
/// </summary>
/// <param name="strUserName">String form of User ID: domain\username</param>
/// <returns>UserPrincipal object</returns>
public static UserPrincipal GetUser(string strUserName)
{
PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain);
try
{
UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, strUserName);
return oUserPrincipal;
}
catch (Exception ex) { return null; }
}
public static string FormatPhoneNumber(string strPhoneNumber)
{
if (strPhoneNumber.Length > 0)
// return String.Format("{0:###-###-####}", strPhoneNumber); // formating does not work because strPhoneNumber is a string and not a number
return Regex.Replace(strPhoneNumber, @"(\d{3})(\d{3})(\d{4})", "$1-$2-$3");
else
return strPhoneNumber;
}
注意していることFormatPhoneNumber
機能は北米の番号用です。見つかった番号(##########
)を取り、それを###-###-####
に分けます。
string[] userProps = GetUserProperties(userId);
string office = userProps[8];
をしかし、ソリューション全体として、あなたはDataRow
の列に、これらの結果を追加してもすることができ、およびとしてそれを返す:
あなたは、そのforeach
ループに戻って、このような特性を得ることができますDataTable
の一部で、ListView
またはGridView
にバインドできます。あなたはこのように、この関数を呼び出します
/// <summary>
/// Gets matches based on First and Last Names.
/// This function takes a list of acceptable properties:
/// USERNAME
/// MIDDLE_NAME
/// MIDDLE_INITIAL
/// EMAIL
/// LOCATION
/// POST
/// PHONE
/// OFFICE
/// DEPARTMENT
///
/// The DataTable returned will have columns with these names, and firstName and lastName will be added to a column called "NAME"
/// as the first column, automatically.
/// </summary>
/// <param name="firstName"></param>
/// <param name="lastName"></param>
/// <param name="props"></param>
/// <returns>DataTable of columns from "props" based on first and last name results</returns>
public static DataTable GetUsersFromName(string firstName, string lastName, List<string> props)
{
string userId = String.Empty;
int resultCount = 0;
DataTable dt = new DataTable();
DataRow dr;
DataColumn dc;
// Always set the first column to the Name we pass in
dc = new DataColumn();
dc.DataType = System.Type.GetType("System.String");
dc.ColumnName = "NAME";
dt.Columns.Add(dc);
// Establish our property list as columns in our DataTable
if (props != null && props.Count > 0)
{
foreach (string s in props)
{
dc = new DataColumn();
dc.DataType = System.Type.GetType("System.String");
if (!String.IsNullOrEmpty(s))
{
dc.ColumnName = s;
dt.Columns.Add(dc);
}
}
}
// Start our search
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
UserPrincipal up = new UserPrincipal(ctx);
if (!String.IsNullOrEmpty(firstName))
up.GivenName = firstName;
if (!String.IsNullOrEmpty(lastName))
up.Surname = lastName;
PrincipalSearcher srch = new PrincipalSearcher(up);
srch.QueryFilter = up;
using (PrincipalSearchResult<Principal> results = srch.FindAll())
{
if (results != null)
{
resultCount = results.Count();
if (resultCount > 0) // we have results
{
foreach (Principal found in results)
{
// Iterate results, set into DataRow, add to DataTable
dr = dt.NewRow();
dr["NAME"] = found.DisplayName;
if (props != null && props.Count > 0)
{
userId = GetUserIdFromPrincipal(found);
// Get other properties
string[] userProps = GetUserProperties(userId);
foreach (string s in props)
{
if (s == "USERNAME")
dr["USERNAME"] = userId;
if (s == "MIDDLE_NAME")
dr["MIDDLE_NAME"] = userProps[3];
if (s == "MIDDLE_INITIAL")
dr["MIDDLE_INITIAL"] = userProps[4];
if (s == "EMAIL")
dr["EMAIL"] = userProps[5];
if (s == "LOCATION")
dr["LOCATION"] = userProps[6];
if (s == "PHONE")
dr["PHONE"] = userProps[7];
if (s == "OFFICE")
dr["OFFICE"] = userProps[8];
if (s == "DEPARTMENT")
dr["DEPARTMENT"] = userProps[9];
}
}
dt.Rows.Add(dr);
}
}
}
}
return dt;
}
:これは私が必要なプロパティで満たさList<string>
に送信、それをやった方法です
string firstName = txtFirstName.Text;
string lastName = txtLastName.Text;
List<string> props = new List<string>();
props.Add("OFFICE");
props.Add("DEPARTMENT");
props.Add("LOCATION");
props.Add("USERNAME");
DataTable dt = GetUsersFromName(firstName, lastName, props);
DataTable
は、それらの列が入りますと、最初の列としてNAME
列があり、ADのユーザーの実際の.DisplayName
になります。
注:あなたはこのすべてを使用するためにSystem.DirectoryServices
とSystem.DirectoryServices.AccountManagement
、System.Text.RegularExpressions
、System.Data
を参照する必要があります。
HTH!
回答で続きを読むには、すべてのsAMAccountNameを使用する方法についてであり、彼らは非常に多くのupvotesを持っている理由私にはわからない:理由です。この質問は、プロパティを取得するためのファーストネームとファーストネームの使用に関するものです。トップ/マークされた正解だけが近くにあります。 – vapcguy