objective-c - 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 的替代方案。
解决方案
也许它对任何人都有帮助,我找到了一种方法来提取连接域而不依赖于分配的用户,只需迭代子节点,识别引用远程活动目录服务的子节点,然后从节点的详细信息中提取域名:
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;
}
}
推荐阅读
- c# - 为 BindingGroup 设置 IsDirty
- java - 仅在调用 System.out.println 时才评估嵌套的 while 循环
- javascript - 如何计算当前值加上进入数组的下一项?
- dart - Dart如何获取列表中的最大重复元素
- php - Lotusscript:在 PHP 中将文件从电子邮件发送到网站的问题
- php - 如何在 Woocommerce 的 PHP 操作中包含多个产品 ID
- bash - for循环期望交互和脚本之间的结果不同
- javascript - 如何隐藏“类型”元素
- r - 使用 ggplot 重现绘图
- xcode - 为什么我的 NSSplitViewItem 在折叠完成之前隐藏它的子视图