Поначалу я тоже был сбит с толку, но все дело в том, чтобы узнать тип элемента коллекции свойств. Как только я узнал, что тип элемента свойств - System.Collections.DictionaryEntry, а значение - это коллекция, состоящая из элементов ResultPropertyValueCollection, стали возможны простые итерации.
Вот что я закончил:
bool attemptResult = false;
string ldap = "LDAP:<Your A.D. specific connection string>";
DirectoryEntry entry = new DirectoryEntry(ldap, username, password, AuthenticationTypes.Secure);
try
{
DirectorySearcher searcher = new DirectorySearcher(entry);
searcher.Filter = "(&(objectClass=User)(sAMAccountName=" + username + "))";
SearchResult one = searcher.FindOne();
attemptResult = true;
string properties = "";
string userData = JsonConvert.SerializeObject(one.Properties);
foreach (System.Collections.DictionaryEntry de in one.Properties) {
properties += (properties.Length > 0 ? ",\n" : "");
properties += "\"" + de.Key + "\": [";
ResultPropertyValueCollection vc = ((ResultPropertyValueCollection)de.Value);
foreach (var val in vc) {
properties += "{\"type\": \"" + val.GetType().Name + "\", \"value\"; \"" + val.ToString() + "\"}";
}
properties += "]";
}
properties = properties.Replace("}{", "},{");
string displayName = one.Properties["displayname"][0].ToString();
string givenName = one.Properties["givenname"][0].ToString();
string lastname = one.Properties["sn"][0].ToString();
}
catch (Exception e) {
//log the error;
}
return attemptResult;
Обратите внимание на быстрое и простое преобразование в строку с помощью JsonConvert.SerializeObject. Это одношаговое преобразование.
Я также выполнил персонализированное преобразование в строку, используя итерации foreach. Это было в большей степени самообучающее упражнение, из которого я узнал, что после того, как я получу значение для именованного свойства, я могу узнать, имеет ли свойство ноль, одно или несколько значений, и действовать соответствующим образом, даже проверяя тип объекта, если это необходимо .
Вот значение, полученное как в строковых переменных, так и в свойствах и пользовательских данных (некоторые элементы удалены для конфиденциальности).
/* Value of userData Obtained with Json serializator*/
{"givenname":["First Name"],"samaccountname":["User.Name"],"cn":["First Name Last Name"],"pwdlastset":[131641282827115142],"whencreated":["2017-10-12T22:16:43"],"badpwdcount":[0],"displayname":["First Name Last Name"],"lastlogon":[131648243091569908],"samaccounttype":[805306368],"countrycode":[0],"objectguid":["SOMETHINGBASE64LIKE=="],"usnchanged":[52144153],"manager":["CN=The Name Of A Person,OU=Department Name,OU=City,OU=GroupName ,DC=Domain,DC=com"],"whenchanged":["2018-03-02T23:21:54"],"name":["First Name Last Name"],"objectsid":["SOMETHINGBASE64LIKE=="],"lastlogoff":[0],"lockouttime":[0],"badpasswordtime":[131647632246625185],"instancetype":[4],"primarygroupid":[513],"objectcategory":["CN=Person,CN=Schema,CN=Configuration,DC=Domain,DC=com"],"logoncount":[1073],"useraccountcontrol":[512],"description":["Some text"],"dscorepropagationdata":["1601-01-01T00:00:00"],"distinguishedname":["CN=First Name Last Name,OU=Department Name,OU=City,OU=GroupName ,DC=Domain,DC=com"],"objectclass":["top","person","organizationalPerson","user"],"adspath":["LDAP://Server/CN=First Name Last Name,OU=Department Name,OU=City,OU=GroupName ,DC=Domain,DC=com"],"usncreated":[39705915],"lastlogontimestamp":[131643676396776065],"userprincipalname":["User.Name@Domain.com"],"employeeid":["99999"],"accountexpires":[9223372036854775807],"department":["DepartmentName"],"codepage":[0],"sn":["Last Name"]}
/* value of properties, the string I concatenated */
"givenname": [{"type": "String", "value"; "First Name"}],
"samaccountname": [{"type": "String", "value"; "User.Name"}],
"cn": [{"type": "String", "value"; "First Name Last name"}],
"pwdlastset": [{"type": "Int64", "value"; "131641282827115142"}],
"whencreated": [{"type": "DateTime", "value"; "12/10/2017 10:16:43 p. m."}],
"badpwdcount": [{"type": "Int32", "value"; "0"}],
"displayname": [{"type": "String", "value"; "First Name Last name"}],
"lastlogon": [{"type": "Int64", "value"; "131648243091569908"}],
"samaccounttype": [{"type": "Int32", "value"; "805306368"}],
"countrycode": [{"type": "Int32", "value"; "0"}],
"objectguid": [{"type": "Byte[]", "value"; "System.Byte[]"}],
"usnchanged": [{"type": "Int64", "value"; "52144153"}],
"manager": [{"type": "String", "value"; "CN=Some Person Name,OU=Department name,OU=City,OU=Group Name,DC=Domain,DC=com"}],
"whenchanged": [{"type": "DateTime", "value"; "2/3/2018 11:21:54 p. m."}],
"name": [{"type": "String", "value"; "First Name Last name"}],
"objectsid": [{"type": "Byte[]", "value"; "System.Byte[]"}],
"lastlogoff": [{"type": "Int64", "value"; "0"}],
"lockouttime": [{"type": "Int64", "value"; "0"}],
"badpasswordtime": [{"type": "Int64", "value"; "131647632246625185"}],
"instancetype": [{"type": "Int32", "value"; "4"}],
"primarygroupid": [{"type": "Int32", "value"; "513"}],
"objectcategory": [{"type": "String", "value"; "CN=Person,CN=Schema,CN=Configuration,DC=Domain,DC=com"}],
"logoncount": [{"type": "Int32", "value"; "1073"}],
"useraccountcontrol": [{"type": "Int32", "value"; "512"}],
"description": [{"type": "String", "value"; "13065, PROGRAMADOR SENIOR"}],
"dscorepropagationdata": [{"type": "DateTime", "value"; "1/1/1601 12:00:00 a. m."}],
"distinguishedname": [{"type": "String", "value"; "CN=First Name Last name,OU=Department name,OU=City,OU=Group Name,DC=Domain,DC=com"}],
"objectclass": [{"type": "String", "value"; "top"},{"type": "String", "value"; "person"},{"type": "String", "value"; "organizationalPerson"},{"type": "String", "value"; "user"}],
"adspath": [{"type": "String", "value"; "LDAP://SERVERNAME/CN=First Name Last name,OU=Department name,OU=City,OU=Group Name,DC=Domain,DC=com"}],
"usncreated": [{"type": "Int64", "value"; "39705915"}],
"lastlogontimestamp": [{"type": "Int64", "value"; "131643676396776065"}],
"userprincipalname": [{"type": "String", "value"; "User.Name@Domain.com"}],
"employeeid": [{"type": "String", "value"; "13065"}],
"accountexpires": [{"type": "Int64", "value"; "9223372036854775807"}],
"department": [{"type": "String", "value"; "IT"}],
"codepage": [{"type": "Int32", "value"; "0"}],
"sn": [{"type": "String", "value"; "Last name"}]
Как видите, некоторые свойства имеют более одного значения. Итак, чтобы получить простой общий список свойств, вам нужно решить, что делать с многозначными свойствами. Скорее всего, вы хотите, чтобы все значения были в виде строк, поэтому несколько значений можно просто объединить с помощью подходящего разделителя.