首页 > 解决方案 > 如何通过 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)")
}

但我不知道如何动态获取adDomainoradExtraPart配置。

同样,如果我能做到那么远,那么对于计算机的记录,我可以做类似的事情:

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()

// … 

那会更好!

标签: swiftobjective-cmacosactive-directory

解决方案


这不是一个完整的答案,但我确实发现有一个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“域绑定”本身:-/


推荐阅读