如何找到计算机所属的组织单位?(Active Directory C#)
我想在C#中找到我的计算机所属的最具体的OU。 我有一些代码可以获得我需要的信息,但它感觉不健壮,需要复杂的解析。 有更好的选择吗?思想?感谢您的帮助 实际上,我想要的是与命令提示符命令等效的命令:如何找到计算机所属的组织单位?(Active Directory C#),c#,active-directory,ou,directorysearcher,C#,Active Directory,Ou,Directorysearcher,我想在C#中找到我的计算机所属的最具体的OU。 我有一些代码可以获得我需要的信息,但它感觉不健壮,需要复杂的解析。 有更好的选择吗?思想?感谢您的帮助 实际上,我想要的是与命令提示符命令等效的命令: dsquery computer -name COMP-HERE 但我需要C#中的它,这被证明是有问题的 DirectorySearcher d = new DirectorySearcher("CN=COMP-HERE"); d.PropertiesToLoad.Add("adspath");
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();
我在谷歌上做了一个简单的搜索,找到了很多关于这个的信息。我认为您的方向是好的,也许可以将您的代码与以下链接进行比较:
或者在此这里有一个在
系统.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
或GroupPrincipal
)上使用FindBy…()
静态方法来找到我们正在寻找的广告对象。这对我来说很有效
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="));
}
IEnumerable machineOU;
使用(var context=newprincipalcontext(ContextType.Domain))
使用(var comp=ComputerPrincipal.FindByIdentity(context,Environment.MachineName))
{
machineOU=comp.discrimitedName.Split(',')。其中(s=>s.StartsWith(“OU=”);
}
您发布的第一个链接几乎与我想做的相反(尽管非常相关)。它试图找到你的,想必是找到它们里面的东西。我正试着拿起一台电脑,找出它在里面的位置。谢谢你的及时回复!这是出乎意料的。所以我对C#和Active Directory的了解是有限的。。。你能详细说明一下这段代码到底在做什么吗?我对主要内容有点困惑。代码工作得很好!我只是想了解。有什么理由使用SkipWhile而不是Where?我不能再给你投票了(实际上我根本不能给你投票,因为我没有足够的声誉),所以你只能接受我的感谢。你太棒了,这是我在stack exchange上发布的第一个非常积极的问题。@BobVale-在这种情况下,最终结果基本相同,但对于这种事情,SkipWhile
更有效<代码>其中将对序列中的每个元素应用测试,而跳过
只测试元素,直到找到一个未通过测试,然后直接将序列的剩余元素传递到输出序列。只需对它所问的OU问题严格一点,但你的答案包括O元素和dc元素