PowerShell大量建立AD帳號

最近在Windows 2008上面玩AD(Active Directory),當相關設定完成後,就遇到一個問題-如何快速建立大量的帳號?雖然在Windows Server 2008 Active Directory目錄服務這本書中有提到可以使用 PowerShell、vbscript等方式都可以做。但有鑑於Windows 2008已經有內建PowerShell,以及他的彈性比較高,所以決定使用 PowerShell 加上 excel(帳戶資料)的模式來產生大量的AD帳號!

在此之前從未接觸過Windows 2008,一時間居然不知如何執行PowerShell!查了很久才知道所謂『Windows 2008內建PowerShell』,並非如我所想像的內建就已經安裝,還是要自己去勾選安裝。總之,將遇到的一些狀況記錄下來…
  • 如何在Windows 2008內使用PowerShell
  • 如何用PowerShell加上 excel(帳戶資料)建立帳號
  • 如何看AD帳戶的屬性名稱

如何在Windows 2008內使用PowerShell

開啟系統管理工具,開啟伺服器管理員(Server Manager)、選擇新增功能(Add a Feature),將PowerShell 打勾,就可以安裝了

如何用PowerShell加上 excel(帳戶資料)建立帳號

基本的操作方式,可以參考Windows PowerShell自動化目錄管理這篇文章。裡面有介紹如何使用Quest Software結合Import-CSV方式快速建立資料。這個範例,雖然簡單短短一行就解決了。但是,裡面的範例實在『太基本』,在實用上還需要做些調整。

一個AD帳號,絕對不會只設定如範例中設定那麼少的屬性。以我的需求來講,我需要讓AD上面的帳號,在做第一次登入時,要『強迫更換密碼』!一開始,我是先找出這屬性所對應的屬性英文名稱…花了不少時間嘗試,才確定對應的屬性名稱為 - pwdLastSet,且必須設定為pwdLastSet=0。但很不幸的,怎麼設定都沒作用…(我覺得,應該是這個屬性無法再建立AD帳號時直接設定。但是再建立AD帳號後再去修改,就會生效。這個狀況,是讓我浪費很多時間在確定屬性是否真的為pwdLastSet)

後來無意間找到有文章指出,可以下參數 -UserMustChangePassword 'true' 的方式來處理(在google上找到蠻多文章都是這樣處理),但是我照本宣科,卻發生錯誤!於是仔細查了一下官方文件(我看所使用v1.2的PDF),發現這版根本沒有這個參數可供使用(這也是我有時候喜歡直接先K文件,而不直接在google找答案的原因之一)

最後,我的作法如下…(僅列出部分屬性,需自行增加)
  1. #設定預設值
  2. #這些設定,需要和實際相同
  3. $const_DC="DC=emp,DC=test,DC=com"
  4. $const_userPrincipalName="@emp.test.com"

  5. #先取得資料
  6. $accountdata=Import-CSV 'account.csv'
  7. foreach ($element in $accountdata){
  8. #開始新增USER帳號
  9. $name=$element.name
  10. $ou=$element.container
  11. $container="OU=$ou,$const_DC"
  12. $password=$element.password
  13. $description=$element.description
  14. $userPrincipalName=$name + $const_userPrincipalName
  15. $mail=$element.mail

  16. $displayName=$element.displayName
  17. $sn=$element.sn #姓
  18. $givenName=$element.givenName #名
  19. $physicalDeliveryOfficeName=$element.physicalDeliveryOfficeName

  20. New-QADUser -name $name -ParentContainer $container -UserPassword $password -samAccountName $name -ObjectAttributes @{description=$description;displayName=$displayName;givenName=$givenName;sn=$sn;physicalDeliveryOfficeName=$physicalDeliveryOfficeName;mail=$mail;userPrincipalName=$userPrincipalName;}

  21. #設定第一次登入時強迫更換密碼
  22. $account="CN="+ $element.name + ",$container"
  23. set-QADUser $account -objectAttributes @{pwdLastSet=0;}
  24. }

附註:要先執行指令 Add-PSSnapin Quest.ActiveRoles.ADManagement ,方可執行

如何看AD帳戶的屬性名稱

開啟Active Directory使用者和電腦,再檢視中,將『進階功能』打開。這樣在選擇帳號點滑鼠右鍵後選內容,就可以看到『屬性編輯器』這個頁籤。裡面就可以看當AD英文屬性名稱。

留言

kalanchen寫道…
請問 $element 代表的意思是?
kalanchen寫道…
請問 $element 代表的意思是?
裡面有寫喔, foreach ($element in $accountdata)
意思$element就是 每一筆accountdatta, 每一筆看起來都含有name,ou,password,description,mail,displayName,姓,名..等資料