我正在为我的公司编写AD程序,而我正在尝试下拉一个对象的OU位置。我可以拉出DistinguishedName,但我想截断该对象,删除对象名称,只有容器。
示例:
CN=Adam Smith,OU=User,OU=CityName,DN=Domain,DC=Domain2
我想将其解析为
OU=User,OU=CityName,DC=Domain,DC=Domain2
or only the OU.
我尝试使用
将其分成数组string _UserDN = (string)searchResult.Properties["distinguishedName"][0];
var userdnsplitarray = _UserDN.Split(',');
我可以这样截断它,但我不确定如何使用数组[2,3]或数组[1,2,3,4]
重新加入此解决方案也必须工作,因为某些树有一个额外的分支,有些人还有一个额外的OU可供使用。
非常感谢任何帮助。
enter code here
答案 0 :(得分:0)
提供
string _UserDN = (string)searchResult.Properties["distinguishedName"][0];
返回格式正确,我建议将初始string
转换(解析)为字典,例如
using System.Linq;
using System.Text.RegularExpressions;
...
string _UserDN = "CN=Adam Smith,OU=User,OU=CityName,DN=Domain,DC=Domain2";
Dictionary<string, string[]> data = _Regex
.Split(_UserDN, @"(?<!\\),") // We split on unescaped commas only
.Select(item => item.Split(new char[] { '=' }, 2))
.Where(pair => pair.Length >= 2)
.GroupBy(pair => pair[0],
pair => pair[1]
.Replace(@"\,", ",")
.Replace(@"\\", @"\"), // drop escapements
StringComparer.OrdinalIgnoreCase)
.ToDictionary(chunk => chunk.Key,
chunk => chunk.ToArray());
测试:
String test = string.Join(Environment.NewLine, data
.Select(pair => $"{pair.Key} : [{string.Join(", ", pair.Value)}]"));
Console.Test(test);
结果:
CN : [Adam Smith]
OU : [User, CityName]
DN : [Domain]
DC : [Domain2]
拥有字典,您可以轻松查询它,例如
// Do we have OU?
bool hasOU = data.ContainsKey("OU");
// How many OU do we have?
int ouCount = data.ContainsKey("OU") ? data["OU"].Length : 0;
// What do we have in "OU" key?
if (data.TryGetValue("OU", out var values)) {
// values is the array which contains all the OU values: ["User", "CityName"]
}
else {
// No OU, no values
}
// Let's remove CN key: OU=User,OU=CityName,DN=Domain,DC=Domain2
string noCNString = string.Join(",", data
.Where(pair => pair.Key != "CN")
.Select(pair => string.Join(",", pair.Value
.Select(value => $"{pair.Key}={value.Replace(@"\", @"\\").Replace(",", @"\,")}"))));
答案 1 :(得分:0)
OU部分将从第一个未转义的逗号开始(不以\
开头)。你可以做这样的事情来找到它:
string dn = "CN=Adam Smith,OU=User,OU=CityName,DN=Domain,DC=Domain2";
int indexOfComma = -1;
do {
indexOfComma = dn.IndexOf(',', indexOfComma + 1);
} while (indexOfComma != 0 && dn[indexOfComma - 1] == '\\');
var ou = dn.Substring(indexOfComma + 1);
那将给你留下OU=User,OU=CityName,DN=Domain,DC=Domain2
。
我看到你正在使用搜索结果,所以这个问题很有意义。但是如果你有另一个案例,你有一个DirectoryEntry
的AD对象,请注意你可以使用Parent
属性,只需拉出distinguishedName
。