PowerShell 2.0 實踐(八)管理活動目錄(中)
上一次我們對活動目錄的用戶和組進行了簡單的管理操作,使用了.NET框架中的System.DirectoryServices
System.DirectoryServices.AccountManagement等類。以及微軟與Quest公司的PowerShell擴展,在實際應用中,推薦使用上述兩種擴展,其語法更加簡潔,便于維護。本次我們將嘗試批量編輯域用戶的信息,以及通過LDAP查詢我們感興趣的信息。
本系列所有腳本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中測試通過。
- 使用 Microsoft Active Directory Cmdlets 批量創建域用戶。
首先準備一個csv文件,將待創建的域用戶名寫入:
其中第一行的"UserName"作為列名。CSV = Comma Separated Values,即"逗號分隔值"文件。這里使用的是一種廣義的csv文件,可以看到并沒有逗號,其實用其他分隔符也可以,只要能區分各個用戶就可以了。
csv文件可以使用Excel打開:
循環遍歷csv文件,提取UserName:
Clear-Host
Import-Csv -Path E:\PSTest\Users.csv | foreach {
New-ADUser -Name $_.UserName `
-SamAccountName $_.UserName -GivenName $_.UserName `
-Surname $_.UserName -Path "ou=Domain Controllers,dc=Lucifer,dc=com" `
-DisplayName $_.UserName -AccountPassword $null `
-CannotChangePassword $false `
-ChangePasswordAtLogon $true `
-UserPrincipalName "$_.UserName@manticore.org" `
}
運行結果:
可以看到用戶默認是禁用的,稍后將學習怎么啟用、禁用用戶。
2、使用 Quest Active Directory Cmdlets 批量創建域用戶。
Clear-Host
Import-Csv -Path E:\PSTest\Users.csv | foreach {
New-QADUser -Name $_.UserName `
-DisplayName $_.UserName `
-SamAccountName $_.UserName `
-ParentContainer "OU=Domain Controllers,DC=Lucifer,DC=com" `
}
還是使用剛才的csv文件,運行結果類似:
其實不一定非要使用csv文件,使用txt、xml等文件也可以,文件只是存儲用戶信息的容器,只要能獲取文件中存儲的用戶信息即可。PowerShell對csv提供了內置支持,即Import-Csv、Export-Csv命令等,所以如果沒有特殊需求,建議使用csv文件。
3、修改用戶信息。
要修改用戶信息,首先要知道用戶有哪些信息:
Get-ADUser -Identity "User1" -Properties *
運行結果:
今天偶然看到AD PowerShell的官方博客,還是很不錯的。
如上圖所示,查詢出了用戶"User1"的所有信息,可以看到還是很多的。-Identity參數用于唯一標識用戶,微軟的Cmdlets支持如下四種Identity:
其中比較常用的是sAMAccountName。
可以用一些PowerShell或LDAP表達式來進行查詢:
Logical Operator | Description | Equivalent LDAP operator/expression |
-eq | Equal to. This will not support wild card search. | = |
-ne | Not equal to. This will not support wild card search. | ! x = y |
-like | Similar to -eq and supports wildcard comparison. The only wildcard character supported is: * | = |
-notlike | Not like. Supports wild card comparison. | ! x = y |
-approx | Approximately equal to | ~= |
-le | Lexicographically less than or equal to | <= |
-lt | Lexicographically less than | ! x >= y |
-ge | Lexicographically greater than or equal to | >= |
-gt | Lexicographically greater than | ! x <= y |
-and | AND | & |
-or | OR | | |
-not | NOT | ! |
-bor | Bitwise OR | :1.2.840.113556.1.4.804:= |
-band | Bitwise AND | :1.2.840.113556.1.4.803:= |
-recursivematch | Uses LDAP_MATCHING_RULE_IN_CHAIN (Win2k3 SP2 and above) | :1.2.840.113556.1.4.1941:= |
如:
Get-ADObject -Filter { CN -like "*bro*" }
Get-ADObject -LDAPFilter "(cn=*bro*)"
查詢CN like bro的活動目錄信息:
我對LDAP語法很不熟悉,臨時查了些資料:
LDAP的存儲規則
區分名(DN,Distinguished Name)
和自然界中的樹不同,文件系統/LDAP/電話號碼簿目錄的每一片枝葉都至少有一個獨一無二的屬性,這一屬性可以幫助我們來區別這些枝葉。
在文件系統中, 這些獨一無二的屬性就是帶有完整路徑的文件名。比如/etc/passwd,該文件名在該路徑下是獨一無二的。當然我們可以有/usr/passwd, /opt/passwd,但是根據它們的完整路徑,它們仍然是唯一的。
在LDAP中,一個條目的區分名稱叫做"dn"或者叫做區分名。在一個目錄中這個名稱總是唯一的。比如,我的dn是"uid=aghaffar, ou=People, o=developer.ch"。不可能有相同的dn,但是我們可以有諸如"uid=aghaffar, ou=Administrators, o=developer.ch"的dn。這同上面文件系統中/etc/passwd 和 /usr/passwd的例子很類似。
我們有獨一無二的屬性,在"ou=Administrators, o=developer.ch" 中uid和在"ou=People, o=developer.ch"中的uid。這并不矛盾。
CN=Common Name 為用戶名或服務器名,最長可以到80個字符,可以為中文;
OU=Organization Unit為組織單元,最多可以有四級,每級最長32個字符,可以為中文;
O=Organization 為組織名,可以3—64個字符長
C=Country為國家名,可選,為2個字符長
LDAP目錄以一系列"屬性對"的形式來存儲記錄項,每一個記錄項包括屬性類型和屬性值(這與關系型數據庫用行和列來存取數據有根本的不同)。
4、將用戶"User1"的部門修改為"開發部",并啟用該用戶:
Get-ADUser -Identity "User1" | Set-ADUser -Department "Develop" -Enabled $true
運行結果:
注意,在PowerShell中,使用$true、$false表示布爾值:true/false。
此外,凡是腳本中包含Q的,如Get-QADUser 均是Quest公司的Cmdlets,否則是微軟的Cmdlets,請注意區分。
5、查詢禁用的用戶:
Clear-Host
Get-QADUser -Disabled
Search-ADAccount -AccountDisabled –UsersOnly
運行結果:
Quest Cmdlets給出了禁用用戶的列表,Microsoft Cmdlets則給出了更為詳細的信息。
6、使用.NET框架中的類進行查詢:
Clear-Host
$user = "User1"
$dc = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root = $dc.GetDirectoryEntry()
$search = [System.DirectoryServices.DirectorySearcher]$root
$search.Filter = "cn=$user"
$result = $search.FindOne()
if($result -ne $null)
{
Write-Host "Find One!"
}
else
{
Write-Host "$user does not exists!"
}
查詢cn=User1的結果,顯然能找到該用戶:
FindOne()方法返回查詢結果中的第一個,FindAll()則會返回所有查詢到的結果。
7、禁用、啟用用戶:
Clear-Host
Disable-ADAccount -Identity "User1"
Enable-ADAccount -Identity "User1" -PassThru
Disable-QADUser -Identity "User1"
Enable-QADUser -Identity "User1"
8、查詢登錄并鎖定的用戶:
Clear-Host
Get-QADUser -Locked
Search-ADAccount –LockedOut
9、移動用戶。為了便于看到效果,我們先新建一個OU:Temp。
注意,取消保護勾選可以方便的刪除該OU:
下面把User1移動到Temp中去。
Move-ADObject -Identity "CN=User1,OU=Domain Controllers,DC=Lucifer,DC=com" -TargetPath "OU=Temp,DC=Lucifer,DC=com"
運行結果:
注意表達式是有順序的,CN要在OU之前,這塊語法我也在慢慢摸索。
再使用Quest Cmdlets將User1移動回去:
Move-QADObject -Identity "CN=User1,OU=Temp,DC=Lucifer,DC=com" -NewParentContainer "OU=Domain Controllers,DC=Lucifer,DC=com"
運行結果:
小結:
本次我們繼續練習了活動目錄的相關操作,主要涉及域用戶的編輯、搜索,其中掌握LDAP的查詢語法非常重要。熟練以后可以快捷高效的對活動目錄對象(不僅僅局限于用戶、組)進行管理。下一次將練習域組的管理操作,以及管理OU、組策略等高級話題。

浙公網安備 33010602011771號