我想在 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
命名空间中使用 PrincipalContext
和 ComputerPrincipal
的解决方案
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
。
一旦我们获得了这个上下文,我们就可以在各种主体类型(可以是 UserPrincipal
、ComputerPrincipal)上使用
或 FindBy...()
静态方法GroupPrincipal
) 来找到我们正在寻找的 AD 对象。
关于c# - 如何找到计算机所属的组织单位? (事件目录 C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11768775/