c# - 如何找到计算机所属的组织单位? (事件目录 C#)

标签 c# active-directory ou directorysearcher

我想在 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();

最佳答案

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

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) 创建一个代表本地 Active Directory 域的 PrincipalContext

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

关于c# - 如何找到计算机所属的组织单位? (事件目录 C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11768775/

相关文章:

c# - GridView 和 objectDataSource

c# - 在 WinForm 应用程序中将显示与业务逻辑分离

java - 使用 JDBC(Java) 的 Active Directory 密码连接

java - LDAP:使用过滤器避免 Active Directory 中的子 CN

active-directory - 删除 Active Directory 用户和计算机中的 OU

c# - 如何获取在 C# 中作为参数传递的表达式的字符串表示形式?

c# - 如何在 C# 中获取所有 ISO 3166-1 国家/地区的数字代码

linux - 从 Windows 或 Linux 设备使用 Python 2.7 查询 Windows Active Directory

java - Activity 目录 : Move users to different OUs

powershell - 如何使用 CMD 从服务器本身查找计算机对象 OU