2013年11月15日 星期五

用 PowerShell 自動匯入門禁卡號至 AD 欄位

  公司的門禁卡、影印機都有與AD整合,所以每當有新進員工或有同仁更換門禁卡時,AD 上儲存卡號的欄位就要手動修改,之前建置門禁系統的廠商有設定每天會將員工編號及卡號匯出成一個 CSV 檔,最近剛好有時間可以研究如何用 PowerShell 將CSV 的值匯入至 AD 欄位中。



 因為現在已經沒人在用呼叫器了,所以就將門禁卡號放在"呼叫器"這個欄位中。


PowerShell Script
Import-module ActiveDirectory
#匯入卡號資料
Import-CSV "D:CardNum.csv" | % {
#指定變數
$USERID = $_.UserID
$CARDNO = $_.CardNo
#讀取 AD 上的卡號屬性
$ADPAGER = get-aduser -filter {samAccountname -eq "$USERID"} -properties *|select pager
#截取卡號
if ($ADPAGER) { $ADCARDNO = ("$ADPAGER").substring(8,10) }
#比對卡號不一致或為空值
if ($ADCARDNO -ne $CARDNO -or !$ADPAGER)
  {
  #寫入新卡號
  set-aduser $USERID -replace @{pager=$CARDNO}
  }
}

Import-module ActiveDirectory
 因為要更新 AD 欄位,所以必須要載入 ActiveDirectory 的模組,才能使用 AD 管理的相關指令。

Import-CSV "D:CardNum.csv"
 指定 CSV 檔案的路徑匯入進來。

$USERID = $_.UserID
$CARDNO = $_.CardNo

 $_UserID 及 $_.CardNo 是對應 CardNum.csv 檔內的欄位名稱。

$ADPAGER = get-aduser -filter {samAccountname -eq "$USERID"} -properties *|select pager
 因為不想讓程式不管卡號有沒有異動,所有帳號的卡號欄位都重新寫入,所以讀出 AD 上的卡號欄位,做為後續判斷的依據,但該行指令讀取出來的格式會是

pager
-----
1000011502


 實際儲存的格式是

@{pager=1000011502}

 所以要用涵數截取所要的卡號格式

if ($ADPAGER) { $ADCARDNO = ("$ADPAGER").substring(8,10) }
 判斷 AD 上的卡號欄位是否為空值,若是為空值就不用截取卡號,若反之,則將 "@{pager=1000011502}" 截取 "1000011502" 出來。

if ($ADCARDNO -ne $CARDNO -or !$ADPAGER)
 若 AD 上的卡號欄位與 CSV 上的卡號不一致,或 AD 上的卡號欄位為空值才執行更新。

set-aduser $USERID -replace @{pager=$CARDNO}
 將 CSV 上的新卡號寫入 AD 上的卡號欄位。


 將 PowerShell Script 存成 .ps1 的檔案後,再到 Windows 排程輸入下列指令設定定時執行,即可每天自動更新卡號至 AD中。

PowerShell -ExecutionPolicy ByPass -File D:Update_CardNo.ps1"


沒有留言:

張貼留言