首页 > 解决方案 > macOS opendirectory:从活动目录 ODNode 对象中提取所有域

问题描述

我想获取绑定到我的活动目录服务器的所有可用网络域。

从我使用的命令行odutil show nodenames检索:

Name                                          State  Refs Type         External Locked Hidden
--------------------------------------------- ------ ---- ------------ -------- ------ ------
/Active Directory                             Online 3                          X      X
/Active Directory/TEST                               10   
/Active Directory/TEST/All Domains            Online 4    Virtual node
/Active Directory/TEST/Global Catalog         Online 6    Virtual node                 X
/Active Directory/TEST/domain.com             Online 6    Virtual node                 X
/Configure                                    Online 2                          X      X
/Contacts                                     Online 3
/LDAPv3                                       Online 1                          X      X
/Local                                        Online 2                          X      X
/Local/Default                                Online 36                         X
/Search                                       Online 19

我只关心基于 Active Directory 的节点,因为我只想列出连接到这些节点的所有域。

在以上两种情况下/Active Directory/myserver/Global Catalog/Active Directory/myserver/domain.com都是隐藏的。

不幸的是,我找不到从命令行输出中获取标记为隐藏节点的方法。也许有人知道怎么做?

我迭代这些节点的代码是:

    ODNode * node = [ODNode nodeWithSession:[ODSession defaultSession] 
                                       type:kODNodeTypeAuthentication error:nil];
    NSArray * subnodes = (__bridge NSArray *)ODNodeCopySubnodeNames((__bridge ODNodeRef)node, NULL);

仅检索非隐藏节点:/Active Directory/myserver/All Domains

编辑 :

在 Windows 中,有一个用于本地计算机的专用命令提取域:

GetComputerNameExW(ComputerNameDnsDomain, domainName, &dwSize))

我希望找到 macOS 的替代方案。

标签: objective-cmacosactive-directory

解决方案


也许它对任何人都有帮助,我找到了一种方法来提取连接域而不依赖于分配的用户,只需迭代子节点,识别引用远程活动目录服务的子节点,然后从节点的详细信息中提取域名:

    NSError *err;
    ODNode * node = [ODNode nodeWithSession:[ODSession defaultSession] 
                                       type:kODNodeTypeAuthentication error:&err];

    if (err) {
        NSLog(@"couldn't fetch parent node, reason = @%", [err description]);
        return;
    }

    NSArray * subnodeNames = [node subnodeNamesAndReturnError:&err];
    if (err) {
       NSLog(@"couldn't fetach subnodeNames. reason = %s", [err description]);
        return;
    }

    
    for (NSString * subnodeName in subnodeNames) {
        ODNode * subnodeObject = [ODNode nodeWithSession:[ODSession defaultSession]
                                                    name:subnodeName
                                                   error:&err];
        if (err) {
           NSLog(@"couldn't fetch ODNode for @%. reason: @%",
                     subnodeName, [err description]);
            continue;
        }
        
        id subnodeDetails = [subnodeObject nodeDetailsForKeys:nil error:&err];
        if (err) {
           NSLog(@"couldn't fetch ODNode details for %@. reason: %@",
                     subnodeName, [err description]);
            continue;
        }

        NSArray * domainName = subnodeDetails[@"dsAttrTypeNative:DomainName"];
        if (domainName) {
            NSLog(@"found default domain = %@", [domainName lastObject]);
            return;
        }
    }

推荐阅读