c#拉出对象位置并从AD输出到变量

时间:2017-12-14 15:37:45

标签: c# arrays string parsing

我正在为我的公司编写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

2 个答案:

答案 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