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』,並非如我所想像的內建就已經安裝,還是要自己去勾選安裝。總之,將遇到的一些狀況記錄下來…
一個AD帳號,絕對不會只設定如範例中設定那麼少的屬性。以我的需求來講,我需要讓AD上面的帳號,在做第一次登入時,要『強迫更換密碼』!一開始,我是先找出這屬性所對應的屬性英文名稱…花了不少時間嘗試,才確定對應的屬性名稱為 - pwdLastSet,且必須設定為pwdLastSet=0。但很不幸的,怎麼設定都沒作用…(我覺得,應該是這個屬性無法再建立AD帳號時直接設定。但是再建立AD帳號後再去修改,就會生效。這個狀況,是讓我浪費很多時間在確定屬性是否真的為pwdLastSet)
後來無意間找到有文章指出,可以下參數 -UserMustChangePassword 'true' 的方式來處理(在google上找到蠻多文章都是這樣處理),但是我照本宣科,卻發生錯誤!於是仔細查了一下官方文件(我看所使用v1.2的PDF),發現這版根本沒有這個參數可供使用(這也是我有時候喜歡直接先K文件,而不直接在google找答案的原因之一)
最後,我的作法如下…(僅列出部分屬性,需自行增加)
附註:要先執行指令 Add-PSSnapin Quest.ActiveRoles.ADManagement ,方可執行
在此之前從未接觸過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找答案的原因之一)
最後,我的作法如下…(僅列出部分屬性,需自行增加)
- #設定預設值
- #這些設定,需要和實際相同
- $const_DC="DC=emp,DC=test,DC=com"
- $const_userPrincipalName="@emp.test.com"
-
- #先取得資料
- $accountdata=Import-CSV 'account.csv'
- foreach ($element in $accountdata){
- #開始新增USER帳號
- $name=$element.name
- $ou=$element.container
- $container="OU=$ou,$const_DC"
- $password=$element.password
- $description=$element.description
- $userPrincipalName=$name + $const_userPrincipalName
- $mail=$element.mail
-
- $displayName=$element.displayName
- $sn=$element.sn #姓
- $givenName=$element.givenName #名
- $physicalDeliveryOfficeName=$element.physicalDeliveryOfficeName
-
- 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;}
-
- #設定第一次登入時強迫更換密碼
- $account="CN="+ $element.name + ",$container"
- set-QADUser $account -objectAttributes @{pwdLastSet=0;}
- }
附註:要先執行指令 Add-PSSnapin Quest.ActiveRoles.ADManagement ,方可執行
留言
意思$element就是 每一筆accountdatta, 每一筆看起來都含有name,ou,password,description,mail,displayName,姓,名..等資料