PowerShell 2.0 實踐(九)管理活動目錄(下)
上一次我們練習了批量創建域用戶,以及對域用戶進行一些查詢、編輯操作。本次將主要對域組進行管理,其次是OU、組策略等高級話題。
本系列所有腳本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中測試通過。
1、查詢域用戶上一次登錄域的時間:
#獲取用戶上一次登錄域的時間
#DateTime.FromFileName -- 摘自 MSDN
#A Windows file time is a 64-bit value that represents the number of 100-nanosecond
#intervals that have elapsed since 12:00 midnight, January 1, 1601 A.D. (C.E.)
#Coordinated Universal Time (UTC). Windows uses a file time to record when an application
#creates, accesses, or writes to a file.
Clear-Host
$t = Get-ADUser -Identity "Administrator" -Properties lastlogon
[DateTime]::FromFileTime([Int64]::Parse($t["lastlogon"]))
運行結果:
域用戶上一次登錄域的時間存儲在屬性:lastlogon中,是一個長整形的數字,注釋中是MSDN的官方解釋,需要用DateTime.FromFileName方法進行轉換。
2、
#檢查用戶密碼過期情況,默認情況下密碼的最大使用期限為42天
#通過檢查pwdlastset屬性來查詢哪些用戶的密碼可能過期
Clear-Host
$now = (Get-Date).ToFileTime()
$end = ((Get-Date).Adddays(-200)).ToFileTime()
$dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root = $dom.GetDirectoryEntry()
$filt = "(&(objectcategory=Person)" + "(objectclass=user)" + "(pwdlastset>=$end)(pwdlastset<=$now))"
$search = [System.DirectoryServices.DirectorySearcher]$root
$search.Filter = $filt
$results = $search.FindAll()
foreach ($result in $results){
$result.properties.distinguishedname
}
運行結果:
3、檢查用戶賬戶過期情況,如將一個域用戶:User1的賬戶過期時間設置為10.2之后:
查詢60內賬戶將到期的用戶:
Clear-Host
$now = (Get-Date).ToFileTime()
$end = ((Get-Date).Adddays(60)).ToFileTime()
$dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root = $dom.GetDirectoryEntry()
$filt = "(&(objectcategory=Person)(objectclass=user)(accountexpires>=$now)(accountexpires<=$end))"
$search = [System.DirectoryServices.DirectorySearcher]$root
$search.Filter = $filt
$results = $search.FindAll()
foreach ($result in $results){
$result.properties.distinguishedname
}
運行結果:
使用Microsoft或Quest的Cmdlets更加簡潔:
Clear-Host
Search-ADAccount -AccountExpiring -TimeSpan "60.00:00:00" –UsersOnly
Get-QADUser -AccountExpiresBefore (Get-Date).AddDays(60)
運行結果:
Microsoft Cmdlets:
Quest Cmdlets:
4、創建域組
在Active Directory中組分為兩類:安全組(Security)和通訊組(Distribution)。安全組是給共享資源指派權限的,通訊組沒有安全方面的功能,基本只應用于電子郵件程序中。
組一般都有自己的作用域的,用來確定樹或林中該組的應用范圍。在Active Directory中有三種不同的組的作用域:通用,全局和本地域。相對應的就劃分為三種不同的組即通用組,全局組和域本地組(在windows2003以前是沒有通用作用域的,這里所介紹的是以windows server 2003為基礎的)。
通用組(Universal):是一種集全局組和域本地組優點于一身的組,可以包含森林中任何的帳戶,全局組和通用組,不能隸屬于全局組,當只有在win2000本機模式或以上時才能被新建。
全局組(Global):可以在林中任意使用,體現的是全局性,也就是說可以利用全局組授予訪問任何域上的資源的權限,但其成員只能是相同域的帳戶和全局組(在win2000本機模式或以上),在混合模式時成員只能是相同域的帳戶。
域本地組(DomainLocal):通常情況下用于授予在本域資源的訪問權限,成員包含林中的帳戶,全局組,通用組(在混合模式下沒有通用組)。
如下,分別使用了Microsoft和Quest的Cmdlets創建了兩個域組:
Clear-Host
New-ADGroup -Name "Developer" -Path "OU=Temp,DC=Lucifer,DC=com" -SamAccountName "開發部" -GroupCategory Security -GroupScope Global -Description "開發部" -DisplayName "開發部"
New-QADGroup -Name "Test" -Description "測試部" -SamAccountName "測試部" -GroupScope Global -GroupType Security -ParentContainer "OU=Temp,DC=Lucifer,DC=com"
運行結果:
5、組中添加域用戶
將User1添加進開發部:
Clear-Host
Get-ADUser -Filter {Name -eq "User1"} -SearchBase "OU=Domain Controllers,DC=Lucifer,DC=com" | foreach {Add-ADGroupMember -Identity "CN=Developer,OU=Temp,DC=Lucifer,DC=com" -Members $($_.SamAccountName)}
將Domain Controllers中的用戶添加進測試部:
Get-QADUser -SearchRoot "OU=Domain Controllers,DC=Lucifer,DC=com" | foreach {Add-QADGroupMember -Identity "CN=Developer,OU=Temp,DC=Lucifer,DC=com" -Member $_.SamAccountName}
運行結果:
6、刪除組成員
使用Microsoft Cmdlets時無法取消刪除確認提示 - -!
Clear-Host
Remove-ADGroupMember -Identity "CN=Developer,OU=Temp,DC=Lucifer,DC=com" -Members "User1"
而Quest Cmdlets就非常人性化,無任何提示,方便批量刪除:
Remove-QADGroupMember -Identity "CN=Test,OU=Temp,DC=Lucifer,DC=com" -Member User2,User3
7、更改組的作用域,支持的方式:
# Universal to global
# Global to universal
# Domain local to universal
# Universal to domain local
![]()
注意通用組和全局組可以相互轉換,域本地組和通用組可以相互轉換,但是全局組和域本地組不能相互轉換。
Clear-Host
Set-ADGroup -Identity "CN=Developer,OU=Temp,DC=Lucifer,DC=com" -GroupScope Universal -GroupCategory Security
Set-QADGroup -Identity "CN=Test,OU=Temp,DC=Lucifer,DC=com" -GroupScope Global -GroupType Distribution
運行結果:
8、查詢組成員
Clear-Host
Get-ADGroupMember -Identity "CN=Developer,OU=Temp,DC=Lucifer,DC=com" | select Name
Get-QADGroupMember -Identity "CN=Test,OU=Temp,DC=Lucifer,DC=com" | select Name
運行結果:
9、管理組策略
組策略(Group Policy)是管理員為用戶和計算機定義并控制程序、網絡資源及操作系統行為的主要工具。通過使用組策略可以設置各種軟件、計算機和用戶策略。
從Windows Server 2008 R2開始微軟提供了組策略相關的PowerShell擴展,可以方便的自動化處理一些配置選項。
Windows Server 2008 R2 組策略新增功能:(摘自TechNet)
在 Windows Server? 2008 R2 和帶有遠程服務器管理工具 (RSAT) 的 Windows? 7 中提供以下更改:
- 組策略的 Windows PowerShell Cmdlet:能夠從 Windows PowerShell(TM) 命令行管理組策略并且能夠在登錄和啟動過程中運行 PowerShell 腳本
- 組策略首選項:其他類型的首選項
- Starter 組策略對象:改進了 Starter GPO
- 管理模板設置:改進了用戶界面和其他策略設置
這里有一篇文章詳細介紹了此次更新,非常專業,建議閱讀。
推薦一下微軟的組策略官方博客。
注意,組策略的PowerShell腳本只能在Windows 7 、Windows Server 2008 R2上運行,其他操作系統即使安裝了PowerShell V2也無法運行。
以Windows Server 2008 R2為例,首先要導入組策略的PowerShell模塊:
Import-Module GroupPolicy
查看此模塊中包含哪些命令:
Get-Command -Module GroupPolicy | Get-Help | Format-Table name, synopsis -AutoSize –Wrap
運行結果:
備份全部組策略:
New-Item -Path C:\GPBak -ItemType Directory -Force
Backup-GPO -All -Path C:\GPBak -Comment "Weekly Bak" -Server BrooksPCNB.Lucifer.com
運行結果:
還原全部組策略:
Restore-GPO -All -Path C:\GPBak -Server BrooksPCNB.Lucifer.com
運行結果:
小結:
我用了三篇博文終于暫時結束了活動目錄的測試,活動目錄是一塊很大的內容,短短三篇文章僅僅是走馬觀花,對常見的任務進行了測試,主要涉及域用戶、域組的創建、修改、刪除、查詢。在PowerShell中主要有三種方法來管理活動目錄:
1、.NET框架中的活動目錄類
2、ADSI WinNT、LDAP Provider
3、Microsoft、Quest Cmdlets(推薦)
實際使用中建議使用第三種,因為其語法更加簡潔,也是官方推薦的方式。
在測試腳本中使用了大量的LDAP查詢,這種語法初次接觸會相當不習慣,我就是如此,不過寫的多了點就好多了,建議熟悉其基本操作,否則在活動目錄管理中將寸步難行。在大多數管理任務中,域用戶、域組的管理是使用最頻繁也是最重要的操作之一,這也是本系列的重點。最后,我們對組策略進行了一次鳥瞰,這塊的PowerShell擴展非常新,直到Windows Server 2008 R2才提供,后面我單獨整理一篇文章出來測試一下組策略。活動目錄告一段落之后,利用10.1假期我打算整理一下TFS 2010相關的管理操作,也熟悉一下TFS 2010的對象模型,再補充一篇《設計TFS 2010自定義流程》的文章,承接上次的《設計TFS 2008自定義流程》。

浙公網安備 33010602011771號