如何找到计算机所属的组织单位?(Active Directory C#)

use*_*986 6 c# active-directory ou directorysearcher

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

真的我想要的是命令提示符命令的等效:

dsquery computer -name COMP-HERE
Run Code Online (Sandbox Code Playgroud)

但我需要在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();
Run Code Online (Sandbox Code Playgroud)

And*_*per 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());
}
Run Code Online (Sandbox Code Playgroud)

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 对象。