一直以來公司的通訊錄使用ldap方式獲取。但是ldap缺點有二:
1、若連不上網域伺服器(越南夏天會停電還一次停兩天),就算我們使用outlook時,並不需要用到通訊錄,但outlook還是會一直出現錯誤,解決方式如下:outlook 關於ldap通訊錄的處理經驗。
2、只能在內網使用,筆電拿到公司外就連不上網域主控站,outlook就會開始罵罵號。
這問題我滿頭痛的,好險最近我開始把重心放在nextcloud上,發現可以透過webdav連線方式,從網際網路直接獲取通訊錄以及行事曆,這樣可以解決上面兩個問題;雖然以後多了一個維護的地方,但這可以解決很多麻煩事,而且好處多多,例如可以透過手機、網頁等等多元方式,直接取得聯絡人以及行事曆。
說做就做,我連上公司nextcloud雲端系統後,原本打算一筆一筆「手動」輸入數百筆通訊錄,但是想想還是從三個廠的網域主控站匯出聯絡人比較實在,再由nextcloud提供的匯入功能匯入即可。
nextcloud提供匯入的檔案格式為vcf format,意即VCARD,而且規定要3.0或以上版本才能匯入,格式長這樣:
BEGIN:VCARD
VERSION:3.0
FN:william
ORG:HT
TITLE:
TEL;TYPE=WORK:
TEL;TYPE=HOME:
TEL;TYPE=CELL:
EMAIL;TYPE=WORK:william@test.com
CATEGORIES:test
NOTE:
UID:79996fd9-b2d6-1111-111e-85f7cd5896e5
END:VCARD
這種需求當然往github找尋解方,找了很久都是2.0的powershell腳本,後來終於在這裡找到,試跑了一次還ok,就差在沒有使用utf8輸出,匯入nextcloud會有亂碼,因此我改了一下寫法如下:
紅色部分請自行斟酌修改,存成xxx.ps1 並且在powershell裡執行;要注意屬性CATEGORIES,對應到nextcloud的聯絡人群組(Contact Group),這很重要。
<#
.SYNOPSIS
Export AD Users as single vcf file
#>
cls
$filename = "C:\temp\vCards.vcf"
remove-item $filename
Get-ADUser -filter {Enabled -eq $True} -Properties * | where {$_.enabled -eq $true} | Foreach-Object {
$user = $_.sAMAccountName
$email = $_.EmailAddress
$phone = $_.OfficePhone
$name = $_.Name
$short = $_.HomePhone
$mobile = $_.MobilePhone
$sede = $_.physicalDeliveryOfficeName
$ufficio = $_.Department
$qualifica = $_.title
$responsabile = ($_.manager -split ',*..=')[1]
if ($phone -or $email -or $mobile){
write-host $user
# Generate vCard
Add-Content -Encoding UTF8 -Path $filename "BEGIN:VCARD"
Add-Content -Encoding UTF8 -Path $filename "VERSION:3.0"
Add-Content -Encoding UTF8 -Path $filename ("FN:" + $_.cn)
Add-Content -Encoding UTF8 -Path $filename ("ORG:test")
Add-Content -Encoding UTF8 -Path $filename ("TITLE:" + $qualifica)
Add-Content -Encoding UTF8 -Path $filename ("TEL;TYPE=WORK:" + $phone)
Add-Content -Encoding UTF8 -Path $filename ("TEL;TYPE=HOME:" + $short)
Add-Content -Encoding UTF8 -Path $filename ("TEL;TYPE=CELL:" + $mobile)
Add-Content -Encoding UTF8 -Path $filename ("EMAIL;TYPE=WORK:" + $email)
Add-Content -Encoding UTF8 -Path $filename ("CATEGORIES:test")
$notedate = (get-date).ToString('d/MM/yyyy')
Add-Content -Encoding UTF8 -Path $filename ("NOTE:")
Add-Content -Encoding UTF8 -Path $filename ("UID:" + $_.objectGUID )
Add-Content -Encoding UTF8 -Path $filename "END:VCARD" #`r`n"
}
}