PowerShell ActiveDirectory WindowsServer IT維運 系統架構師

命令列工具管理Active Directory 批次操作取代繁瑣手動

AI時代腳本比GUI更好用 高效率AD維運自動化

2026-04-20
善用PowerShell命令工具能夠更快地完成重複性工作,減少手動操作錯誤,確保設定一致性。此外,對於一些複雜度較高的管理操作,也可透過自行撰寫的Script來輕鬆達到自動化、批次化以及精準化的效益。若想成為頂尖的Windows Server系統架構師,它將是不可或缺的工具。

早在Windows Server 2003 SP1/SP2以及R2版本時期,IT人員就可以自行下載並安裝PowerShell 1.0來使用,但直到Windows Server 2008版本時,才成為系統內建的功能。在還沒有PowerShell以前,其實已有一些內建的命令工具可用來管理Active Directory,但是它們存在缺點。例如,不同的命令工具各有不同的參數格式,學習不易。另外針對一些複雜任務的管理,需要自行將多個命令工具組合使用,操作十分繁瑣。

或許是因為這些舊的命令工具有著許多實務上的不便,因此在尚未推出PowerShell以前,選擇使用命令工具來管理Active Directory的IT人員並不多見,大多數的IT人員還是會選擇內建的GUI工具進行管理,例如「Active Directory使用者和電腦」以及「Active Directory網域和信任」。

如今已是PowerShell全面盛行的IT年代,那麼它與大家所熟悉的GUI工具,在使用上究竟有哪一些不同,請參考表1的比較說明。

建立全新AD樹系

在一個尚未建置Active Directory網域的Windows網路中,只要準備一台Windows Server(建議Windows Server 2025)的實體主機或虛擬機器,並且配置好靜態的IP設定,就可以透過內建的「伺服器管理員」介面中的「管理」→「新增角色與功能」選項來安裝Active Directory網域服務伺服器角色。

若要透過Windows PowerShell命令視窗進行安裝,可執行以下的命令參數:

Install-WindowsFeature -Name AD-Domain-Services -Include ManagementTools

無論是透過GUI工具還是PowerShell命令來安裝Active Directory網域服務伺服器角色,接下來都需要建立新的樹系與網域,而這一項操作同樣地可以選擇透過GUI工具或PowerShell命令來完成。

在此以PowerShell命令為例,範例中先指定建立一個lab02.com網域,並設定好AD資料庫、記錄檔以及SYSVOL共用資料夾的存放路徑。接著,設定連同DNS伺服器角色一併安裝,並且完成目錄服務修復模式(DSRM)密碼設定:

Install-ADDSForest -DomainName "lab02.com" -DomainNetbiosName "lab02" -CreateDnsDelegation:$false -DatabasePath "C:\Windows\ NTDS" -LogPath "C:\Windows\ NTDS" -SysvolPath "C:\Windows\ SYSVOL" -InstallDns:$true -SafeModeAdministratorPassword (ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force) -Force:$true

新增、修改、移除帳號

新增、修改、移除網域帳號是IT人員日常的工作之一,若每一次對於新進人員帳號的建立其設定皆是大同小異,那麼想要更有效率地快速建立,並且避免可能的人為操作錯誤,不妨直接寫成一串簡單的命令參數,就能夠快速地解決。

如圖1所示,透過以下的命令範例,建立一個名為「Sandy Chen」的網域帳號,並且該用戶可使用Sandy或Sandy@lab02.com進行登入。接著,再完成密碼的設定並啟用該帳號:

圖1  新增與修改帳號。

New-ADUser -Name "Sandy Chen" -SamAccountName "Sandy" -UserPrincipalName "Sandy@lab02. com" -AccountPassword (ConvertTo- SecureString "IronMan@2025" -AsPlainText -Force) -Enabled $true

關於新增網域帳號,所能設定的屬性參數相當的多。如果在完成帳號的新增後,才發現有一些屬性忘了設定,只要再透過Set-ADUser命令便可以做修改,例如透過以下的命令參數來設定Sandy帳號的描述欄位值:

Set-ADUser -Identity "Sandy" -Description "IT Security Architect"

接著,透過「Active Directory使用者和電腦」的GUI工具,查看剛剛修改的帳號是否已經成功。如圖2所示,在Sandy帳號內容的「Account」頁面中,便可以看到Description欄位已經填入修改了。

圖2  查看帳號內容。

接下來,若需要修改屬性中的「部門」名稱並且帳號不只一個?很簡單!只要先在CSV檔案內容中準備好這些登入帳號的清單(例如「C:\users.csv」),隨後如圖3所示執行以下的命令參數,即可批次完成設定所有帳號的部門名稱:

圖3  批次設定帳號部門名稱。

Import-Csv "C:\users.csv" | ForEach-Object { Set-ADUser -Identity $_. SamAccountName -Department $_.Department Write-Host "已更新部門:$($_. SamAccountName) → $($_. Department)"

上述的PowerShell命令範例,總共修改三個帳號的部門名稱。透過「Active Directory使用者和電腦」的GUI工具來開啟其中一位的帳號內容,即可在如圖4所示的「Organization」頁面中查看到該欄位。

圖4  帳號組織資訊。

至於如何透過PowerShell命令來查看Jovi帳號的部門屬性值,只要執行以下命令與參數即可:

Get-ADUser -Identity "Jovi" -Properties Department | Select- Object Name, Department

若是要查詢帳號的完整屬性值,可以改為執行「Get-ADUser -Identity " Jovi " -Properties *」命令。未來如果需要移除Jovi帳號,則執行「Remove-ADUser -Identity " Jovi "」。

批次建立網域帳號

在一些大企業或學校往往會有大量建立AD帳號的需求,例如學校網路中的某些應用系統,其帳號驗證方式可能整合於AD網域,在這種情況下每當有新生入學,便需要批次建立大量的新生帳號。

針對這一項需求,若是透過PowerShell命令來完成一樣是相當容易的。首先,必須建立一個CSV檔案(NewUsers.csv),其中內容的欄位描述至少必須包含如圖5所示的四個主要屬性,分別是登入帳號名稱(Name)、用戶名稱(Username)、UPN登入的Email地址以及密碼。當然,可以根據實際需求,添加任何New-ADUser命令所支援的屬性欄位。

圖5  CSV檔案內容。

完成CSV檔案的準備後,緊接著只要開啟Windows PowerShell ISE介面,執行以下的命令與參數。若在上一個步驟的CSV檔案內容中,有自行添加更多的屬性欄位,那麼在此命令參數的設定中也務必同樣添加:

Import-Csv "C:\NewUsers.csv" | ForEach-Object {   New-ADUser -Name $_.Name -SamAccountName $_.Username -UserPrincipalName $_.UPN -AccountPassword (ConvertTo- SecureString $_.Password -AsPlainText -Force) -Enabled $true }

無論是透過哪一種方式所建立的帳號,只要如圖6所示執行以下的命令與參數,就可以查詢最近建立的前十筆帳號清單,並且按照日期與時間的新舊排序。若想要調整顯示的資料筆數,只須修改其中的-First 10參數設定即可:

圖6  查詢最新建立的10筆帳號。

Get-ADUser -Filter * -Properties whenCreated | Sort-Object whenCreated -Descending | Select- Object Name,whenCreated -First 10

匯出網域帳號清單

IT部門經常可能因為資安稽核或系統整合需求,而需要將AD網域帳號進行匯出。針對這項需求,只要透過以下的命令參數,即可將目前網域中的所有帳號的用戶名稱、登入名稱以及啟用狀態,匯出至「C:\ADUsers.csv」檔案中:

Get-ADUser -Filter * | Select -Object Name,SamAccount Name,Enabled | Export-Csv -Path "C:\ADUsers.csv" -NoTypeInformation

關於此範例的使用技巧,若需要篩選特定欄位條件的帳號,可設定-Filter參數值來加以篩選,例如使用「-Filter "Enabled -eq $true"」參數設定,表示僅處理已啟用的帳號。若是只要匯出特定部門的帳號(例如IT),則可以使用「Get-ADUser -Filter "Department -eq 'IT'"」參數設定。

圖7所示便是透過上述命令範例,成功匯出至ADUsers.csv檔案並以Excel開啟的範例,這裡面的每一筆資料皆包含Name、SamAccountName、Enabled三個欄位。

圖7  檢視CSV檔案內容。

建立網域安全性群組

前面介紹有關於透過PowerShell命令來管理AD網域帳號的方法,接下來示範的是如何透過PowerShell命令來建立AD網域安全性群組。如圖8所示,可執行以下的命令與參數來建立一個名為「「ITAdmins」的網域安全性群組:

圖8  建立並查詢網域安全性群組。

New-ADGroup -Name "ITAdmins" -GroupScope Global -GroupCategory Security Get-ADGroup -Identity "ITAdmins" | Select Name,GroupScope,Group Category

Active Directory網域群組可分為兩種類型:安全性群組(Security Group)與通訊群組(Distribution Group)。安全性群組用於「權限控管」,而通訊群組則用於「郵件分發」用途,因此當執行New-ADGroup命令時,才需要透過-GroupCategory參數來指定群組的類型。以下詳解有關於這兩種群組的主要差異與用途:

‧安全性群組具備SID(Security Identifier),除了可用於設定檔案、資料夾、印表機、SharePoint、Exchange、SQL Server等資源的存取權限外,還可結合群組原則(GPO)的套用、網域登入的控制、VPN存取、RDP權限等。

‧通訊群組僅用於電子郵件分發,不具備SID,無法用來設定資源權限、無法套用群組原則或控制網域資源存取。常運用於Exchange的Outlook郵件清單,例如建立一個涵蓋全公司人員的通訊群組Allstaff,並設定Email地址allstaff@company.com,以便將需要全公司知道的郵件訊息,只發送至此群組即可。

管理網域群組成員

在前面的範例中所建立的ITAdmins網域安全性群組還只是一個空殼,如圖9所示,接著透過以下的命令將Sandy帳號加入至此群組中:

圖9  新增與查詢網域群組。

Add-ADGroupMember -Identity "ITAdmins" -Members "Sandy"

若想要知道ITAdmins這個群組有哪一些成員,則執行以下的命令範例:

Get-ADGroupMember -Identity "ITAdmins"

完成群組成員的設定後,也可以透過「Active Directory使用者和電腦」的GUI工具,開啟ITAdmins這個群組內容中的「Members」頁面,如圖10所示,如此一來即可查看到此群組中的所有成員。

圖10  安全性群組內容。

如果想要反過來查詢使用者所屬的群組,該怎麼做呢?若是透過「Active Directory使用者和電腦」的GUI工具,只要開啟要查看帳號「內容」中的「群組」頁面即可。如果想要使用PowerShell命令進行查詢,則執行以下的命令範例來查詢Sandy帳號所屬的群組清單:

Get-ADUser -Identity "Sandy" | Get-ADPrincipalGroupMembership | Select Name

當群組與成員的數量越來越多時,若想要查詢所有群組的類型與成員數量,可以參考以下命令與參數範例:

Get-ADGroup -Filter * -Properties GroupCategory, Members | Select- Object Name, GroupCategory, @{Name="成員數";Expression={($_. Members).Count}}

重設帳號密碼

對於AD網域帳號的密碼,一般都是透過群組原則中的密碼原則來設定到期的天數。但如果需要在到期前幫用戶(例如Sandy)修改帳號密碼,只要執行以下的命令與參數就能夠幫該帳號的密碼重新設定為「NewP@ss2025」:

Set-ADAccountPassword -Identity "Sandy" -NewPassword (ConvertTo- SecureString "NewP@ss2025" -AsPlainText -Force)

進一步若需要設定Sandy的帳號密碼永不過期,則執行以下的命令與參數。如此一來,此帳號便不會受到群組原則中的密碼原則所影響:

Set-ADUser -Identity "Sandy" -PasswordNeverExpires $true

除此之外,還可透過如下的命令參數,設定Sandy帳號的用戶無法自行變更密碼:

Set-ADUser -Identity "Sandy" -CannotChangePassword $true

完成上述兩項有關於帳號密碼的進階設定後,該如何透過「Active Directory使用者和電腦」的GUI工具來查看這些設定?只要在帳號的「內容」開啟後,如圖11所示,點選至「Account」頁面,便可以在「Account options」區域內查看到這兩設定已經勾選。當然,也可以在此取消這些選項設定。

圖11  帳號內容。

關於帳號密碼的選項設定,若需要查詢在整個AD網域中有哪一些用戶帳號的密碼已被設定為永不過期,可參考以下的命令參數範例:

Get-ADUser -Filter * -Properties Name,PasswordNeverExpires | Where-Object { $_.PasswordNever Expires -eq $true } | Select-Object Name,Password NeverExpires

批次重設帳號密碼並強制變更要求

接下來,示範批次帳號密碼的更新,並且在成功更新後,強制要求用戶必須在登入後立即變更密碼。如圖12所示,在下列的PowerShell腳本範例中,將針對ITAdmins這個群組的所有成員進行設定。

圖12  批次重設帳號密碼並強制變更要求。

執行過程中若是成功設定,將會在完成設定的帳號前面顯示「密碼已重設並強制變更」。如果因故發生設定失敗,則會顯示「無法處理」以及系統的例外訊息來協助除錯:

# 設定一組新密碼變數 $newPassword = ConvertTo-SecureString "Lab02#2026" -AsPlainText -Force # 取得ITAdmins群組的所有使用者成員 $users = Get-ADGroupMember -Identity "ITAdmins" -Recursive | Where-Object { $_.objectClass -eq "user" } foreach ($user in $users) {     try {       # 重設密碼 Set-ADAccountPassword -Identity $user.DistinguishedName -NewPassword $newPassword -Reset       # 強制使用者下次登入時變更密碼 Set-ADUser -Identity $user.DistinguishedName -ChangePasswordAtLogon $true Write-Host "密碼已重設並強制變 更:$($user.SamAccountName)" -ForegroundColor Green     } catch { Write-Warning "無法處理  $($user.SamAccountName): $($_.Exception.Message)"     } }

在上述執行結果的範例中,可以發現群組中的四名用戶的帳號皆已成功設定,接下來,這些帳號便可以使用新的密碼進行登入。在準備開始登入前,若從「Active Directory使用者和電腦」的GUI工具,查看其中一位用戶的帳號內容,便可以發現在「Account」頁面中,已勾選「Account options」區域內的「User must change password at next logon」設定。

針對這些已被設定的用戶帳號,如果他們尚未使用自己的網域帳號登入用戶端電腦,而直接要使用遠端桌面工具來連線登入網域中任一主機,將會出現如圖13所示的「遠端桌面連線」錯誤訊息。

圖13  遠端桌面無法連線。

如圖14所示,則是用戶登入伺服器或用戶端電腦後,所強制要求變更密碼的設定頁面。用戶只要在此完成兩次新密碼的輸入,就可以完成密碼設定。後續便可以繼續使用這組新的密碼,以遠端桌面工具來連線存取網域中任一被授權的主機或應用系統。

圖14  強制變更密碼要求。

帳號的停用與啟用管理

帳號的啟用與停用,在AD網域的管理中也是常見的任務。舉例來說,當公司有人員需要留職停薪時,IT部門便需要暫時停用該帳號,等到該人員恢復上班再啟用他的帳號。

在如圖15所示的範例中,先執行以下三個命令參數,停用這三位用戶的帳號:

圖15  停用與查詢帳號。

Disable-ADAccount -Identity "Sandy" Disable-ADAccount -Identity "Jessie" Disable-ADAccount -Identity "Jovi"

成功停用這三個帳號後,緊接著執行如下的命令參數,查詢網域中目前已停用的帳號清單。結果發現,除了有Jovi、Jessie以及Sandy之外,還多出了兩個帳號,分別是Guest與krbtgt,它們其實是系統預設的帳號而非一般用戶帳號:

Get-ADUser -Filter 'Enabled -eq $false' -Properties Name,SamAccount Name | Select-Object Name,SamAccountName

往後如果需要啟用特定的帳號(例如Sandy),則執行如下的命令:

Enable-ADAccount -Identity "Sandy"

當需要啟用的帳號數量較多時,可以考慮使用foreach迴圈命令,將指定條件的帳號一次完成啟用。可使用以下的PowerShell腳本批次啟用ITAdmins群組中的所有帳號,當然也可以將此腳本修改成批次停用帳號的功能:

$groupName = "ITAdmins" $members = Get-ADGroupMember -Identity $groupName -Recursive | Where-Object  { $_.objectClass -eq "user" } foreach ($member in $members) { Enable-ADAccount -Identity $member.SamAccountName Write-Host "已啟用帳號:$($mem ber.SamAccountName)"

組織單位(OU)的管理

在AD網域的管理中,除了用戶的帳號與群組外,最重要的還有組織容器的管理。因為透過組織容器的使用,可以將帳號與電腦妥善地分類,讓之後所建立的各種群組原則,可以直接套用在選定的組織容器,來加以管制容器中的帳號與電腦。

要如何善用PowerShell來管理織容器呢?首先,使用以下的命令來檢視目前AD網域的組織單位架構:

Get-ADOrganizationalUnit -Filter * | Select Name,DistinguishedName

接下來,假設想要建立另一個名為「DevDept」的組織單位(OU),可執行以下命令與參數來完成,其中-Path的參數值便是描述新容器的所在位置,也就是lab02.com網域下的ITDept組織單位:

New-ADOrganizationalUnit -Name "DevDept" -Path "OU=ITDept,DC=lab02,DC=com"

完成DevDept組織單位的建立後,可透過以下的命令移動一個現有的Jovi帳號至該組織單位中:

Move-ADObject -Identity "CN=Jovi,CN=Us ers,DC=lab02,DC=com" -TargetPath  "OU= DevDept,OU=ITDept,DC=lab02,DC=com"

未來若需要查詢選定的組織單位中有哪一些帳號,可參考如下的命令與參數範例。從這個範例執行結果中,可以得知目前DevDept組織單位中的帳號名稱、啟用狀態、SID以及UPN名稱:

Get-ADUser -SearchBase " OU=DevDept, OU=ITDept,DC=lab02,DC=com" -Filter *

網域帳號鎖定管理

帳號的鎖定管理,在任何應用系統的安全配置中都是相當重要,因為能夠有效阻止用戶帳號的密碼被惡意人士使用暴力式破解,就好像銀行提款卡若連續輸入三次錯誤的密碼後,卡片就會被提款機自動沒收一樣。

想要在現行的AD網域中使用帳戶鎖定管理功能,必須透過群組原則管理編輯器進行啟用與設定。首先,在「開始」→「執行」中輸入「gpmc.msc」,開啟群組原則管理工具(Group Policy Management)。

緊接著,在網域或選定的組織容器中建立群組原則物件(GPO),並開啟群組原則管理編輯器(Group Policy Management Editor)。在如圖16所示的範例中,已展開至「Computer Configuration」→「Policies」→「Windows Settings」→「安全性設定」→「帳戶原則」之下的「帳戶鎖定原則」頁面。

圖16  群組原則管理編輯器。

在「帳戶鎖定原則」頁面中,可以進行設定的原則共有四大項,包括允許系統管理帳戶鎖定、重設帳戶鎖定計數器的時間間隔、帳戶鎖定時間、帳戶鎖定閾值。其中最重要是最後三項的設定,至於「允許系統管理帳戶鎖定」設定,除了網域內有超過一個以上的系統管理員帳號,否則不建議啟用該功能,以避免系統管理員自己的帳號遭到鎖定。

在「帳戶鎖定原則」設定啟用並生效後,無論網域的用戶使用哪一種方式來連線登入網域,例如用戶端登入、伺服端登入、遠端桌面登入、VPN登入以及第三方應用系統的整合登入,只要密碼錯誤的閾值到達上限時,便會出現類似如圖17所示的錯誤訊息而無法繼續嘗試登入。

圖17  帳號鎖定通知。

另外必須特別注意的是,如果在某個組織單位(OU)建立或套用上述GPO的「帳戶鎖定原則」,這些設定並不會影響該容器中的網域帳戶,因為網域帳戶的密碼與鎖定原則是由網域控制器統一管理,換句話說,它只能在網域層級的容器生效。

IT人員如果想要查詢目前AD網域中有哪些帳號已經遭到鎖定,如圖18所示,只要執行以下的命令與參數即可得知:

圖18  查詢帳號鎖定與事件清單。

Search-ADAccount -LockedOut -UsersOnly | Select-Object Name, SamAccountName,LockedOut

一旦AD網域中有帳號遭到鎖定,在第一時間,網域控制站主機的「事件檢視器」也會出現一個識別碼為4740的安全性事件。對於這個事件的檢視,除了透過「事件檢視器」的GUI工具來查詢外,也可以執行以下的PowerShell命令與參數快速查詢:

Get-WinEvent -FilterHashtable @{LogName='Security';ID=4740} | Format-Table TimeCreated,Message

在上述的範例當中有一個名為「Julia」的帳號遭到鎖定,此時若想要解鎖已被鎖定的Julia帳號,除了透過「Active Directory使用者和電腦」的GUI工具,開啟Julia帳號的「內容」並在「Account」頁面中勾選「Unlock account」設定外,也可以執行PowerShell命令「Unlock-ADAccount -Identity "Julia"」來迅速解決。

當某個群組中的多個帳號遭到鎖定,想要快速解鎖的最佳作法是使用PowerShell。可透過以下的PowerShell腳本解鎖ITAdmins群組中的所有已被鎖定的帳號:

$group = "ITAdmins" $members = Get-ADGroupMember -Identity $group -Recursive | Where- Object { $_.objectClass -eq "user" } foreach ($member in $members) { if ((Get-ADUser $member. SamAccountName -Properties LockedOut).LockedOut) { Unlock-ADAccount -Identity $member.SamAccountName Write-Host "已解鎖: $($member.SamAccountName)"     } }

如果想要在解鎖帳號前,先查詢所有已被鎖定的帳號狀態資訊,可執行以下的PowerShell腳本來完成。在這個腳本執行的結果中,能夠清楚檢視到每一位遭鎖定的帳號的名稱、錯誤密碼時間、距今時間、錯誤登入的次數以狀態資訊:

Search-ADAccount -LockedOut | ForEach-Object { $user = Get-ADUser $_ -Properties LastBadPasswordAttempt, BadLogonCount $now = Get-Date     if ($user.LastBadPasswordAttempt)     { $span = New-TimeSpan -Start $user.LastBadPasswordAttempt -End $now $minutes = [math]::Floor($span. TotalMinutes) $seconds = $span.Seconds $lockedAgo = "$minutes 分 $seconds 秒前" } else { $lockedAgo = "未知"     }     [PSCustomObject]@{  使用者 = $user.SamAccountName 錯誤密碼時間 = $user. LastBadPasswordAttempt 距今 = $lockedAgo 錯誤登入次數 = $user. BadLogonCount 狀態 = "已鎖定"     } }

網域帳號登入時間管理

在資訊安全的稽核管理中,可能需要查詢某些用戶的最新登入時間,這個時候選擇使用PowerShell肯定是最佳選擇。執行以下的PowerShell命令與參數,即可查詢Sandy帳號最近登入的日期與時間:

Get-ADUser -Identity "Sandy" -Properties LastLogonDate

此外,通常在AD網域建置多年以後,就會留下許多已不再使用的帳號,而這些帳號可能是曾經某些離職的人員或應用系統所使用,如今若要清查,選擇使用PowerShell會是最好的方法。

可透過以下的PowerShell腳本查詢目前網域中30天內未登入的帳號清單,其中還包括這些帳號最新登入的日期與時間。因此,執行結果若是該帳號的LastLogonDate欄位是呈現空白,就表示此帳號至今從未登入過網域:

$threshold = (Get-Date). AddDays(-30) Get-ADUser -Filter * -Properties  LastLogonDate | Where-Object { $_.LastLogonDate -lt $threshold -or !$_. LastLogonDate } | Select-Object Name, SamAccountName, LastLogonDate

對於某些暫時開放使用的網域帳號,可以事先為這些帳號設定過期時間,如此一來,到期時這些帳號便會自動無法進行登入。舉例來說,若想針對「Julia」這個帳號的使用設定一個到期日,可以參考如下的PowerShell命令與參數:

Set-ADUser -Identity "Julia" -AccountExpirationDate  "12/31/2025"

如果想要隨時查詢所有已過期的網域帳號,則參考以下的PowerShell腳本。此範例設計已排除沒有設定過期時間的帳號,並且會顯示所有已過期的用戶名稱、登入名稱以及過期時間:

Get-ADUser -Filter * -Properties AccountExpirationDate | Where-Object { $_.AccountExpirationDate -ne $null -and $_.AccountExpirationDate -lt  (Get-Date) } | Select-Object Name,SamAccountNam e,AccountExpirationDate

如果需要匯出所有已過期的網域帳號清單至CSV檔案,以便能夠從Excel中開啟進行整理與統計,可參考以下的PowerShell腳本,其中Export-Csv命令所使用的-Encoding UTF8參數設定,可以確保有使用到繁體中文為用戶名稱的資料,在CSV檔案內容中不會呈現亂碼:

Get-ADUser -Filter * -Properties AccountExpirationDate | Where-Object { $_.AccountExpirationDate -ne $null -and $_.AccountExpirationDate -lt  (Get-Date) } | Select Name,SamAccountName,Accou ntExpirationDate | Export-Csv -Path "C:\ ExpiredAccounts.csv" -NoTypeInformation -Encoding UTF8

限制用戶指定電腦登入網域

在一些製造業的企業網路中,通常會設置一些共用電腦讓現場人員使用,不過不同的共用電腦為了方便稽核管理,可能需要限制這些人員所能夠登入與使用的電腦。

針對上述的IT管理需求,無論是選擇透過「Active Directory使用者和電腦」的GUI工具,或是PowerShell命令工具以及腳本都可輕易做到。在此執行以下的命令參數,限制Jovi帳號僅能夠經由網域中的SERVER01電腦來登入網域:

Set-ADUser -Identity "Jovi" -LogonWorkstations "SERVER01"

完成上述設定後,繼續透過如下命令與參數,檢查Jovi帳號是否已經成功完成登入工作站設定:

Get-ADUser -Identity "Jovi" -Properties LogonWorkstations | Select-Object Name, LogonWorkstations

接下來,找一台非指定的電腦,嘗試使用Jovi帳號進行登入。此時作業系統便會出現無法使用此電腦進行登入的相關訊息。

然後,開啟「Active Directory使用者和電腦」的GUI工具,查看Jovi帳號內容中的「登入工作站」設定,發現確實目前該帳號僅限於在SERVER01主機進行登入。

上述範例只是針對單一網域帳號進行登入工作站設定,以下的PowerShell腳本範例則是針對整個「生產部A01」群組成員,將限制僅能透過A01電腦登入網域:

$members = Get-ADGroupMember -Identity "生產部A01" -Recursive | Where-Object { $_.objectClass -eq "user" }   foreach ($user in $members) { Set-ADUser -Identit $user. SamAccountName -LogonWorkstations "A01" }

若是要批次設定的帳號不是針對群組成員,而是要針對lab02.com網域下「生產部」組織單位(OU)的所有帳號,限制僅能透過A01電腦登入網域,則參考以下的PowerShell腳本範例:

$users = Get-ADUser -SearchBase "OU=生產部A01,DC=lab02,DC=com"  -Filter *   foreach ($user in $users) { Set-ADUser -Identity $user.SamAccountName  -LogonWorkstations "A01" }

網域用戶登入腳本

對於人員帳號的登入,除了控制可登入的電腦與時間之外,在他們成功登入網域後,如果想要讓他們所登入的電腦自動執行指定的PowerShell腳本,該怎麼做呢?

針對這方面的需求,只要使用群組原則,搭配網域共用資料夾,即可讓選定的組織單位成員在登入網域後自動執行指定的腳本。接著,看一下實作講解。

首先透過以下的PowerShell腳本依序建立一個ITDept-LoginScript群組原則物件(GPO),然後設定這個GPO連結到現行的ITDept組織單位:

# 建立新的GPO New-GPO -Name "ITDept- LoginScript" -Comment "Login script for ITDept users" # 將GPO連結到OU New-GPLink -Name "ITDept- LoginScript" -Target "OU=ITDept,DC=lab02,DC=com"

完成GPO的建立與連結設定後,最後只要開啟群組原則管理編輯器(GPMC),並且展開至「User Configuration」→「Policies」→「Windows Settings」→「Scripts」節點,再將預先準備好的PowerShell Script,如圖19所示,設定於「登入」內容中的「PowerShell指令碼」頁面內即可。

圖19  GPO登入腳本設定。

上述的PowerShell腳本若執行後出現「The file is not digitally signed」錯誤訊息,即表示現行的執行政策腳本必須要有數位簽章,但所提供的login.ps1並沒有簽署。

解決方法有兩種,第一種是透過另一個非PowerShell的腳本(例如.bat或是.cmd),來執行命令「powershell.exe -ExecutionPolicy Bypass -File \\lab02.com\NETLOGON\login.ps1」。

另一種方式是,透過修改如圖20所示的「Turn on Script Execution」原則來解決,也就是將該原則的設定,除了選擇「Enabled」外,還要在「Options」欄位中選擇「Allow all scripts」。該原則位於「Computer Configuration」→「Policies」→「Administrative Templates」→「Windows Components」→「Windows PowerShell」節點內。

圖20  允許執行所有PowerShell Script。

<本文作者:顧武雄,Microsoft MVP 2004-2016、MCITP與MCTS認證專家、台灣微軟Technet、TechDays、Webcast、MVA特約資深顧問講師、VMware vExpert 2016-217、IBM Unified Communications/Notes/Domino/Connections Certified。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!