Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何找到计算机所属的组织单位?(Active Directory C#)_C#_Active Directory_Ou_Directorysearcher - Fatal编程技术网

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

如何找到计算机所属的组织单位?(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");

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

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


或者在此

这里有一个在
系统.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元素