swift - 如何通过 Apple 的 Open Directory 获取当前计算机的 ODRecord,而无需在我的应用程序中硬编码任何特定的 Active Directory 域/名称?
问题描述
Apple 为其 Active Directory 实施提供了Open Directory框架。
如何使用他们的 Open Directory 框架来获取“绑定”ODNode
对象和“这台”计算机的ODRecord
对象?
我的意思是,我可以从命令行dsconfigad -show
获取一些信息,例如:
Active Directory Forest = ad-root.local
Active Directory Domain = example.com
Computer Account = serno123$
但我不确定如何在没有硬编码的情况下从我的 Swift/Objective-C 代码中访问那些“域”和“计算机帐户”。我可以看到一些相关节点的代码片段,例如
do {
let nn = ODSession.default().nodeNames()
print("Node names: \(nn)")
} catch {
print("ERROR: \(error)")
}
记录如下内容:
节点名称:[/Active Directory/EG、/Active Directory/EG/ad-root.local、/Active Directory/EG/example.com、/Contacts、/Local/Default、/Search]
但不清楚如何获取“这台计算机通过计算机帐户 Y 绑定到 X”信息,看来我需要从这些节点之一(哪个节点?)跳转到ODRecord
代表我的代码正在运行的计算机。
如果我的代码可以使用“Active Directory Domain = example.com”信息,我想我可以通过以下方式获得正确的节点:
let adDomain = "example.com"
let adExtraPart = "EG" // where does this come from?
let nameToSearch = "/Active Directory/\(adExtraPart)/\(adDomain)"
do {
let n = try ODNode(session: ODSession.default(), name: nameToSearch)
print("Node: \(n)")
mainAdNode = n; // [used below]
} catch {
print("ERROR: \(error)")
}
但我不知道如何动态获取adDomain
oradExtraPart
配置。
同样,如果我能做到那么远,那么对于计算机的记录,我可以做类似的事情:
let n = mainAdNode // e.g. from snippet above
let computerAccount = "serno123$"
do {
let r = try n.record(withRecordType: kODRecordTypeComputesr, name: computerAccount, attributes: nil)
print("Record: \(r)")
computerRecord = r // the object I want to use in my code…
} catch {
print("ERROR: \(error)")
}
但同样不清楚我可以在哪里获得computerAccount
价值而不对其进行硬编码或做出假设。它与主机名或诸如此类的关系。
需要明确的是,我不一定要使用上面的确切 API。如果相反,我可以简单地:
let mainAdNode = try ODSession.default().domainNode()
let computerRecord = try mainAdNode.computerAccount()
// …
那会更好!
解决方案
这不是一个完整的答案,但我确实发现有一个ODNodeType
对应于可用作“主”或“默认”节点的东西:
let adNode = try ODNode(
session: ODSession.default(),
type: ODNodeType(kODNodeTypeAuthentication)
)
正如文档所述,这不仅用于身份验证,而且 [强调] 是“用于身份验证或记录查找的节点”。在我的机器上以及可能在其他地方,它/Search
实际上会返回节点。
至于我的问题的第二部分,如果计算机的 Active Directory 标识符是已知的,那么可以使用/Search
上面获得的节点来检索它:
let computerRecord = try adNode.record(
withRecordType: kODRecordTypeComputers,
name: "\(computer.id)$",
attributes: nil
)
...但是当然,这仍然“硬编码”机器名称,或者至少假定知道如何通过其他机制获取它,而不是 Active Directory“域绑定”本身:-/
推荐阅读
- python - 将 cv2.warpPerspective 替换为大图像
- android - 选项卡布局不显示片段
- php - 如何解决 mysql group_concat 限制?
- typeerror - TypeError:类型不可调用
- python - 从 HUE HDFS 网站读取文件时收到 Python 标记错误
- flutter - 您如何管理 ScanStreamTransformer 累加器大小?
- shopify - 在 Shopify 网站的 Tapcart 应用程序中以 https:// 形式输出双正斜杠
- javascript - 反应显示来自对象数组的数据
- python - 在特定子字符串之前提取 2 个子字符串
- excel - 在电子表格中手动输入数据时如何满足 [$-409] 要求?