由網域主控站匯出VCARD 電子名片標準VERSION:3.0

一直以來公司的通訊錄使用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"
    }

}

讓moodle透過nextcloud提供的oauth2 服務進行登入認證

1. moodle與nextcloud需要有一樣名稱的管理者帳號
有點類似微軟網域伺服器之間的互信,我這邊兩方都建立admin這個有管理權限的帳號。

2. 管理者帳號登入nextcloud網站進行設定
新增客戶端
名稱: moodle
網址: https://xxxxx/admin/oauth2callback.php (xxxxx 為您moodle伺服器網址)

3.管理者帳號登入moodle網站,讓oauth2納入認證範圍
網站管理->外掛->身分認證->管理身分認帳

4.管理者帳號登入moodle網站,將nextcloud產生的帳密輸入進去

   

    

    

儲存變更後,點選以下小圖示,進行moodle與nextcloud的第一次交流驗證,成功後會出現一個綠色勾勾

   

4. 大功告成

最後建議安裝keepalive,延長已登入狀態,否則常常要登入,麻瓜會生氣氣(安裝時,要注意/bitnami/moodle/local目錄是否可讀寫)

安裝完畢,可以設定session存活時間,最多300分鐘

此時我們就可以設定外觀,隱藏需要登入帳號與密碼的畫面

在「原始初始化SCSS」輸入以下語法隱藏登入畫面,只剩下oauth2登入。

.login-form {display:none}

設定完登出,重新登入就只能透過oauth2登入了

moodle無法使用多個網域主控認證(Ldap server)

moodle 是目前最強開源線上學習系統,台灣學校在疫情期間紛紛安裝線上開課,當然也很適合公司當作知識管理系統、線上無紙化測驗使用;可惜只能認證一個ldap server,有多網域伺服器就很麻煩,除非上雲端或許還可以解決此問題。

好險我想到moodle支援oauth2,可以透過公司目前最常用的nextcloud 雲端檔案伺服器進行驗證,而nextcloud可以連結多個ldap server進行驗證,那這樣可以解決問題了。

nextcloud如何刪除ldap使用者

nextcloud可以連接多個ldap server,這對於IT來說很方便。

隨著時間推移,越來越多使用者離職,帳號設定成停用,當我們確認可以刪除後,nextcloud卻無法正常透過UI介面刪除帳號,這會造成一些困擾;很懶的我後來我爬文,解方居然是下指令才能刪除,更麻煩的是只能一個一個帳號刪除,真真嚇死我。

好險有個神人寫shell script就能批次刪除。

for i in $(php occ ldap:show-remnants | awk -F'| ' '{print $2}'); do
    echo "Delete user: $i"
    php occ user:delete $i
done

因為我用的是容器(docker),指令如下:

for i in $(docker exec -u www-data -it nextcloud php occ ldap:show-remnants | awk -F'| ' '{print $2}'); do
  echo "Delete user: $i"
  docker exec -u www-data -it nextcloud php occ user:delete $i
done

Done.

警告:刪除帳號會導致該帳號所有檔案一併被刪除。

worpress (docker) 連接 Active Directory(ldap)

我為了要測試教育訓練相關外掛程式「LearnPress」,必須先搞定員工能登入網站「上課」這件事。

參考以往經驗,我選擇在wordpress系統,安裝教育訓練外掛,而不使用moodle這類風評好又完全免費的系統,原因在於moodle太龐大了,很難駕馭;反之,wordpress可當作公司內部公告網站,讓平時員工習慣上此網站,也趁此加裝教育訓練模組,員工比較容接觸而上課。

wordpress系統要能連上網域主控站,才可讓員工登入,我找到的外掛為next-active-directory-integration

搜尋以下外掛且安裝完畢,於外掛啟用之前,容器必須安裝相關套件,才能正確連線,否則會出現錯誤。

docker exec -it wordpress_wordpress_1 /bin/bash
#####
apt-get update
apt-get install -y libldap2-dev
docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/
docker-php-ext-install ldap
rm -rf /var/lib/apt/lists/*
apt-get purge -y --auto-remove libldap2-dev
/etc/init.d/apache2 restart

#http://www.jaqb.gda.pl/eng/Community/Blog/Enable-LDAP-support-in-Docker-image-of-Wordpress

進容器安裝相關套件後,就可以啟用外掛,通知使用者輸入「帳號@域名」 就可以登入了。

至於ldap設定部分我就不多說,請自行依情況處理。

NTPWEdit可解主機”此工作站和主要網域間的信任關係失敗”

這個我也不知道怎回事, 反正解法是想辦法用本地端帳號登入, 用NTPWEdit(點此下載)這款軟件, 搭配優啟通, 或是 usbox 開機碟製作工具, 先做出開機碟再開機->執行 NTPWEdit->選擇 C:\WINDOWS\SYSTEM32\CONFIG\SAM 改掉裡面本機帳號之密碼, 重開就可以本機帳號登入,

登入後, 先退出網域, 再重新加入網域, 就可以挽回網域主控站的心, 重新認可這台主機了

outlook 關於ldap通訊錄的處理經驗

公司是小公司, 所以我都自架郵件伺服器, 使用postfix mail server + 微軟的網域主控站做認證.

同事的通訊錄就使用ldap連到網域主控,快速設定通訊錄 一直以來相安無事, 若是遇到亂碼,就改用戶端windows系統支援UTF-8

但是最大的問題是, 若是筆電拿到外面去, ldap就無法連線, 就算用不到ldap通訊錄, 收發信的時候, 也常常出現ldap無法連線的錯誤, 很是困擾.

後來發現能修改預設通訊錄檢查方式, 就能避掉外出人員, 收發信的問題.

預設值是”從全域通訊錄清單開始“, 我們改成”從聯絡人資料夾開始“, 開啟通訊錄,也改成”Outlook通訊錄

g suite 替代方案-自架mail server , postfix+openldap

之前一直維護的是 postfix + M$ 的AD 認證 , 這也可以拿來取代google 代管的mail , 但是沒事還要生出windows server , 這錢花了就算了, 就怕一直要更新… 因此花了5天時間,認真研究 , 讓postfix + openldap 認證 , 做成docker images , 也提供範例架設docker openldap server .

值得注意的是 openldap 必須要吃進去 postfix 的 ldap schema 才能跟postfix整合(aliases) .

https://hub.docker.com/r/inmethod/docker-postfix-openldap

ldap將schema轉到ldif

這把年紀了,還在用ldif ,金害!

因為我有需求, 將postfix aliases屬性加到openldap裏面, 只找到schema , 因此又找到 fuck-openldap.sh , 看來這位老兄對openldap很不爽

  • openldap環境下
root@6fa88f73c061:/# ./fuck-openldap.sh postfix.schema
./fuck-openldap.sh: converting /postfix.schema to LDIF //postfix.ldif
config file testing succeeded
./fuck-openldap.sh: LDIF file successfully created as //postfix.ldif

若你要玩postfix + ldap , 正好該ldap server是openldap server , 你就必須把這個ldif加到 openldap 裏面去, 檔案我準備好了,請按這裡下載postfix.ldif

postfix ldap測試/查詢帳號是否存在

postfix 很常見搭配微軟的AD , AD的設定檔長這樣, 檔案名稱為 xxx.cf

server_host = <AD server IP>
search_base = ou=xx,dc=yyy,dc=com
version = 3
query_filter = (&(objectclass=*)(mail=%s))
result_attribute = samaccountname  #Account from DC
result_format = %s/Maildir/
bind = yes
bind_dn = cn=zzz,cn=Users,dc=yyy,dc=com
bind_pw = password

配合以下指令,可以用來查詢email對應的帳號是否正確

postmap -q  abc@yyy.com ldap:/directory/xxx.cf

這樣就可以測試帳號是否存在了

1 2