NotesDirectory + NotesDirectoryNavigator:LotusScript 查詢 Domino 目錄
你的 agent 需要查使用者的郵件伺服器、確認某個群組的成員清單、或驗證一個 Notes 名稱是不是存在。最直接的做法是 db.GetView("($Users)") 然後逐行找 — 但這樣要自己開 names.nsf、管 view 快取、處理多個目錄來源。
LotusScript 從 Notes 7 起有 NotesDirectory — 一個高層次的目錄查詢 API、Domino server 背後可能有多個目錄(primary + extended / LDAP)、這個 class 統一處理、不用你知道底層結構。
重點摘要
NotesDirectory是「查 Domino 目錄」的高層 API、不需自己開 names.nsf- 取得方式:
session.GetDirectory(serverName)、serverName是空字串""表示本地 LookupNames(view, names, items)— 指定 view 名稱、查一批名稱的指定欄位、快取進物件LookupAllNames— 掃整個 view 的所有名稱GetMailInfo(name)— 快速取一個使用者的郵件伺服器跟郵件路徑、不需手動 lookup- 查詢結果用
NotesDirectoryNavigator走訪 —FindFirstName/FindNextName/GetFirstItemValue LimitMatches = True限制單次最多 50 筆(效能保護)、SearchAllDirectories = True搜所有已配置的目錄
取得 NotesDirectory 物件
Dim session As New NotesSession
' 查本 server 的目錄Dim dir As NotesDirectorySet dir = session.GetDirectory("")
' 查指定 server 的目錄Set dir = session.GetDirectory("MailServer/ACME")
Print "目錄 server:" & dir.ServerLookupNames — 查指定名稱的欄位值
' 查 jsmith 和 alice 兩個人的 FullName + MailServer + MailFileDim names(1) As Stringnames(0) = "John Smith"names(1) = "Alice Chen"
Dim items(2) As Stringitems(0) = "FullName"items(1) = "MailServer"items(2) = "MailFile"
' LookupNames(view, names, items) — 快取結果到 dir 物件Call dir.LookupNames("($Users)", names, items)
' 建 navigator 走訪結果Dim nav As NotesDirectoryNavigatorSet nav = dir.CreateNavigator()
If nav.FindFirstName() Then Do Print "姓名:" & nav.GetFirstItemValue() If nav.FindFirstItem("MailServer") Then Print "郵件伺服器:" & nav.GetFirstItemValue() End If If nav.FindFirstItem("MailFile") Then Print "郵件路徑:" & nav.GetFirstItemValue() End If Loop While nav.FindNextName()End IfGetMailInfo — 快速取郵件資訊
不需要手動 LookupNames、直接用 GetMailInfo 取一個使用者的郵件設定:
Dim mailInfo As VariantmailInfo = dir.GetMailInfo("John Smith")
' mailInfo(0) = MailServer(含 Notes 路徑,如 MailServer/ACME)' mailInfo(1) = MailFile(如 mail/jsmith.nsf)' mailInfo(2) = MailDomain' mailInfo(3) = MailSystem(常數:MAIL_NOTES_TYPE = 1)
If Not IsNull(mailInfo) Then Print "郵件伺服器:" & mailInfo(0) Print "郵件路徑:" & mailInfo(1)End If實務上這是最常用的 API — 要自動轉寄、找使用者信箱、或開 mail.nsf 時、用 GetMailInfo 不用自己 lookup。
LookupAllNames — 掃整個 view
Dim items(0) As Stringitems(0) = "FullName"
' 掃 $Users view 的所有人Call dir.LookupAllNames("($Users)", items)
Dim nav As NotesDirectoryNavigatorSet nav = dir.CreateNavigator()
Dim count As Integercount = 0If nav.FindFirstName() Then Do count = count + 1 Set nav = Nothing ' 不用 nav 也可以只數數 Loop While nav.FindNextName()End IfPrint "目錄共 " & count & " 個使用者"注意:LimitMatches = True 時只回傳前 50 筆、要掃全部要先設 dir.LimitMatches = False。
NotesDirectoryNavigator 走訪
NotesDirectoryNavigator 是走訪 LookupNames 快取結果的游標:
| 方法 | 說明 |
|---|---|
FindFirstName() | 移到第一個名稱(重置位置) |
FindNextName() | 移到下一個名稱 |
FindFirstItem(itemName) | 在目前名稱下移到指定欄位 |
FindNextItem() | 移到同欄位的下一個值(多值欄位用) |
GetFirstItemValue() | 取目前欄位的第一個值 |
GetNextItemValue() | 取同欄位的下一個值 |
兩個關鍵屬性
' 搜尋所有已配置的目錄(primary + extended + LDAP)dir.SearchAllDirectories = True
' 限制每次 LookupNames 最多 50 筆(預設 True)' 全掃時要改 False、但注意效能dir.LimitMatches = FalseSearchAllDirectories = False(預設)只搜主要 Domino Directory、速度較快。True 會納入所有已設定的輔助目錄(更多屬性說明見官方 NotesDirectory class 文件)。
同類別在其他語言
| 語言 | 對應 |
|---|---|
| LotusScript | NotesDirectory / NotesDirectoryNavigator |
| Java | lotus.domino.Directory / DirectoryNavigator(去掉 Notes 前綴、用完要 .recycle()) |
| SSJS | 沒有直接對應 — 目錄查詢在 XPages 通常透過 Domino REST API 完成 |