8

我想在 C# 中找到我的计算机所属的最具体的 OU。我的代码可以获取我需要的信息,但感觉不够健壮,需要复杂的解析。有更好的选择吗?想法?任何帮助表示赞赏!

我真正想要的是命令提示符命令的等价物:

dsquery computer -name COMP-HERE

但是我在 C# 中需要它,这被证明是有问题的。

DirectorySearcher d = new DirectorySearcher("CN=COMP-HERE");
d.PropertiesToLoad.Add("adspath");
SearchResultCollection results = d.FindAll();
foreach (SearchResult searchResult in results) {
    foreach (string propertyKey in searchResult.Properties.PropertyNames) {
        ResultPropertyValueCollection valueCollection = searchResult.Properties[propertyKey];
        foreach (Object propertyValue in valueCollection) {
            Console.WriteLine(
            "{0}:{1}",
            propertyKey,
            propertyValue.ToString());
        }
    }
}
Console.ReadLine();
4

3 回答 3

4

这是在命名空间中使用PrincipalContextand的解决方案ComputerPrincipalSystem.DirectoryServices.AccountManagement

string machineOU;
using (var context = new PrincipalContext(ContextType.Domain))
using (var comp = ComputerPrincipal.FindByIdentity(context, Environment.MachineName))
{
    machineOU = String.Join(",", comp.DistinguishedName.Split(',')
                                                       .SkipWhile(s => !s.StartsWith("OU="))
                                                       .ToArray());
}

机器的专有名称的 Linq 处理将其拆分为它的组件元素,跳过第一个元素之前的任何元素OU=...,然后重新组合其余部分。留下包含 OU 的专有名称。

更多信息

命名空间中的类System.DirectoryServices.AccountManagement为各种类型的安全主体(帐户)提供了相当高级的抽象。

PrincipalContext基本上是帐户存储库的抽象。它可以引用计算机的帐户数据库 ( PrincipalType.Machine)、Active Directory 域或全局目录 ( PrincipalType.Domain) 或 Active Directory 应用程序分区 ( PrincipalType.ApplicationDirectory)。

new PrincipalContext(ContextType.Domain)创建一个PrincipalContext表示本地 Active Directory 域。

一旦我们有了这个上下文,我们就可以使用FindBy...()各种主体类型(可以是UserPrincipalComputerPrincipalGroupPrincipal)的静态方法来找到我们正在寻找的 AD 对象。

于 2012-08-01T23:20:01.807 回答
0

我在谷歌上做了一个简单的搜索,发现了很多这方面的信息。我认为您的方向很好,也许可以将您的代码与这些链接进行比较:

如何在 Active Directory 或此处获取堆栈溢出的组织单位列表

于 2012-08-01T23:07:57.403 回答
0

这对我有用

IEnumerable<string> machineOU;
using (var context = new PrincipalContext(ContextType.Domain))
using (var comp = ComputerPrincipal.FindByIdentity(context, Environment.MachineName))
{
  machineOU = comp.DistinguishedName.Split(',').Where(s => s.StartsWith("OU="));
}
于 2012-11-14T16:51:31.443 回答