Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

Get-ADUser: Tìm kiếm thông tin người dùng Active Directory bằng PowerShell

Cmdlet Get-ADUser trong Module Active Directory PowerShell

Cmdlet Get-ADUser nằm trong module chuyên biệt để tương tác với Active Directory – Active Directory Module for Windows PowerShell. Các cmdlet của module RSAT-AD-PowerShell cho phép thực hiện nhiều thao tác trên các đối tượng AD.

Lưu ý: Trước đây, để lấy thông tin thuộc tính tài khoản người dùng AD, bạn phải dùng các công cụ khác nhau: bảng điều khiển ADUC (kể cả các truy vấn AD đã lưu), script VBS, dsquery, v.v. Tất cả các công cụ này có thể dễ dàng thay thế bằng cmdlet Get-ADUser.

Trong ví dụ này, chúng ta sẽ chỉ cách sử dụng cmdlet Get-ADUser PowerShell để lấy thông tin về lần cuối thay đổi mật khẩu của người dùng, thời hạn hết hạn mật khẩu và các thuộc tính người dùng khác.

Để sử dụng module RSAT-AD-PowerShell, bạn cần chạy PowerShell với quyền quản trị và import module bằng lệnh:

Import-Module ActiveDirectory

Module RSAT-AD-PowerShell được cài đặt mặc định trên Windows Server 2012 (và mới hơn) khi triển khai vai trò Active Directory Domain Services (AD DS). Để cài đặt module trên máy chủ thành viên domain Windows Server, chạy lệnh:

Install-WindowsFeature -Name "RSAT-AD-PowerShell" –IncludeAllSubFeature

Để sử dụng cmdlet Get-ADUser trên Windows 10/11 desktop, bạn cần cài đặt phiên bản RSAT phù hợp. Bạn có thể kích hoạt RSAT qua Settings → Apps → Optional Features → Add a feature → RSAT: Active Directory Domain Services and Lightweight Directory Services Tools.

Bạn cũng có thể cài đặt module RSAT AD trên Windows 10 và 11 bằng PowerShell:

Add-WindowsCapability –online –Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0"

Nếu module RSAT-AD-PowerShell chưa được cài đặt, khi chạy lệnh Get-ADUser sẽ xuất hiện lỗi:

Get-ADUser: The term 'get-aduser' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Kiểm tra xem module đã được cài đặt chưa, và nếu cần, import vào phiên PowerShell:

Import-Module ActiveDirectory

Cũng có cách sử dụng module AD-PowerShell mà không cần cài đặt RSAT trên máy tính. Chỉ cần copy các file module chính và import module vào phiên PowerShell:

Import-Module "C:\PS\AD\Microsoft.ActiveDirectory.Management.dll"
Import-Module "C:\PS\AD\Microsoft.ActiveDirectory.Management.resources.dll"

Danh sách đầy đủ tất cả các tham số của cmdlet Get-ADUser có thể lấy được như sau:

help Get-ADUser

Cách tìm người dùng AD và liệt kê thuộc tính với Get-ADUser?

Để sử dụng cmdlet Get-ADUser, bạn không cần chạy dưới tài khoản có quyền domain admin hoặc ủy quyền. Bất kỳ người dùng domain AD được ủy quyền nào cũng có thể chạy lệnh PowerShell để lấy giá trị hầu hết các thuộc tính đối tượng AD (trừ các thuộc tính bảo mật, xem ví dụ trong bài Local Administrator Password Solution – LAPS). Nếu cần chạy lệnh Get-ADUser dưới tài khoản khác, sử dụng tham số –Credential.

Để hiển thị danh sách tất cả tài khoản người dùng domain, chạy lệnh:

Get-ADUser -filter *

Quan trọng: Không khuyến khích chạy lệnh này trong domain AD có số lượng tài khoản người dùng lớn. Điều này có thể gây tải nặng cho domain controller cung cấp thông tin AD.

Sử dụng cmdlet Set-ADUser để thay đổi thuộc tính người dùng Active Directory.

Để hiển thị thuộc tính của một người dùng cụ thể, sử dụng tham số –Identity. Identity có thể là tên người dùng, tên đăng nhập (SAMAccountName), DN (Distinguished Name), SID hoặc GUID.

Các lệnh PowerShell sau sẽ trả về cùng kết quả cho cùng một tài khoản người dùng AD:

Get-ADUser –Identity b.smith
Get-ADUser –Identity "CN=Brian Smith,OU=Users,OU=Berlin,DC=woshub,DC=loc"
Get-ADUser –Identity "Brian Smith"

Mặc định, cmdlet Get-ADUser chỉ trả về 10 thuộc tính cơ bản (trong hơn 120 thuộc tính tài khoản người dùng): DistinguishedName, SamAccountName, Name, SID, UserPrincipalName, ObjectClass, trạng thái tài khoản (Enabled: True/False theo thuộc tính UserAccountControl AD), v.v. Trong trường hợp này, đầu ra cmdlet không chứa thông tin về thời gian thay đổi mật khẩu cuối cùng của người dùng.

Để thực hiện truy vấn AD trên một domain controller cụ thể, sử dụng tùy chọn -Server:

Get-ADUser –Server DC01.woshub.com –Identity tstuser

Nếu cần lấy dữ liệu người dùng từ domain AD khác, bạn cần chỉ định tên domain controller và thông tin đăng nhập để truy cập:

$ADcred = Get-Credential
Get-ADUSer tstuser -Server DC01.contoso.com -Credential $ADcred

Hiển thị thông tin chi tiết tất cả thuộc tính người dùng

Để hiển thị thông tin chi tiết về tất cả thuộc tính người dùng có sẵn, chạy lệnh:

Get-ADUser -identity tuser -properties *

Cmdlet Get-ADUser với công tắc Properties * liệt kê tất cả thuộc tính của người dùng AD và giá trị của chúng (kể cả các thuộc tính trống). Danh sách tương tự các thuộc tính người dùng có sẵn trong snap-in đồ họa Active Directory Users and Computers (dsa.msc) dưới tab attribute editor.

Tiếp theo, chúng ta sẽ định dạng đầu ra Get-ADUser để hiển thị các thuộc tính người dùng cần thiết. Ví dụ, bạn muốn hiển thị giá trị các thuộc tính sau:

  • PasswordExpired
  • PasswordLastSet
  • PasswordNeverExpires
  • LastLogonTimestamp

Chạy lệnh:

Get-ADUser tuser -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires, lastlogontimestamp

Bây giờ trong dữ liệu người dùng có thông tin về trạng thái mật khẩu tài khoản (Expired: True/False), ngày thay đổi mật khẩu cuối cùng và thời gian đăng nhập domain cuối cùng của người dùng (thuộc tính lastlogontimestamp). Để hiển thị thông tin này ở dạng bảng thuận tiện hơn và loại bỏ các thuộc tính không cần thiết, sử dụng Select-Object –Property và Format-Table:

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires

Get-ADUser -SearchBase: Lấy người dùng từ OU cụ thể

Để chỉ hiển thị người dùng từ một container domain cụ thể (Organizational Unit), sử dụng tham số –SearchBase:

Get-ADUser -SearchBase 'OU=London,DC=woshub,DC=loc' -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires

Nếu cần chọn người dùng từ nhiều OU cùng lúc, sử dụng script PowerShell sau:

$OUs = "OU=NY,DC=woshub,DC=com","OU=LA,DC=woshub,DC=com","OU=MA,DC=woshub,DC=com"
$OUs | foreach {Get-ADUser -SearchBase $_ -Filter * |select Name, Enabled}

Cách lấy địa chỉ email người dùng từ AD bằng PowerShell?

Địa chỉ email người dùng là một trong các thuộc tính đối tượng người dùng trong Active Directory. Để liệt kê địa chỉ email của người dùng, bạn phải thêm trường EmailAddress vào thuộc tính của cmdlet Get-ADUser.

Get-ADUser -filter * -properties EmailAddress -SearchBase 'OU=Paris,OU-Fr,DC=woshub,DC=com'| select-object Name, EmailAddress

Danh sách tài khoản người dùng đã kích hoạt có địa chỉ email:

Get-ADUser -Filter {(mail -ne "null") -and (Enabled -eq "true")} -Properties Surname,GivenName,mail | Select-Object Name,Surname,GivenName,mail | Format-Table

Để lấy danh sách người dùng Active Directory không có địa chỉ Email:

Get-ADUser -Filter * -Properties EmailAddress | where -Property EmailAddress -eq $null

Ví dụ sau cho phép xuất danh sách email công ty từ AD ra file CSV. Sau đó, bạn có thể import danh sách địa chỉ CSV này vào các email client desktop như Outlook hoặc Mozilla Thunderbird:

Get-ADUser -Filter {(mail -ne "null") -and (Enabled -eq "true")} -Properties Surname,GivenName,mail | Select-Object Name,Surname,GivenName,mail | Export-Csv -NoTypeInformation -Encoding utf8 -delimiter "," $env:temp\adress_list.csv

Get-ADUser: Xuất người dùng Active Directory ra CSV với PowerShell

Danh sách kết quả người dùng domain với thuộc tính có thể xuất ra file văn bản:

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires > C:\temp\users.txt

Hoặc bạn có thể xuất danh sách người dùng AD ra file CSV:

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | where {$_.name –like "*Dmitry*"} | sort-object PasswordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -path c:\tmp\user-passwords-expires.csv -Append -Encoding UTF8

Danh sách người dùng AD có thể xuất trực tiếp ra file Excel bằng PowerShell.

Ví dụ Filter Get-ADUser

Sử dụng công tắc –Filter, bạn có thể lọc danh sách tài khoản người dùng theo một hoặc nhiều thuộc tính. Điều này hữu ích để tìm kiếm người dùng AD có thuộc tính khớp với tiêu chí chỉ định. Giá trị cho các thuộc tính cụ thể của người dùng AD có thể được chỉ định làm đối số cho tham số này. Khi sử dụng tham số –Filter, cmdlet Get-ADUser sẽ chỉ hiển thị người dùng khớp với tiêu chí lọc.

Ví dụ, tôi muốn liệt kê tài khoản người dùng đang hoạt động (Enabled) có tên chứa “Dmitry”. Ví dụ dưới đây sử dụng nhiều bộ lọc; bạn có thể kết hợp điều kiện bằng các toán tử so sánh PowerShell. Trong ví dụ này, thuộc tính người dùng phải thỏa mãn cả hai điều kiện lọc (-and):

Get-AdUser -Filter "(Name -like '*Dmitry*') -and (Enabled -eq 'True')" -Properties * |select name,enabled

Tất cả các toán tử logic PowerShell đều có thể dùng để chọn giá trị cho thuộc tính người dùng (-eq, -ne, -gt, -ge, -lt, -le, -like, -notlike, -and, -or, v.v.)

Ngoài ra, bạn có thể sắp xếp danh sách người dùng kết quả theo một thuộc tính cụ thể với cmdlet Sort-Object. Bạn cũng có thể dùng cmdlet Where-Object để chỉ định nhiều tiêu chí lọc cùng lúc.

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires -SearchBase 'OU=NY,DC=woshub,DC=com'| where {$_.name –like "*Dmitry*" -and $_.Enabled -eq $true} | sort-object PasswordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires

Như vậy, bạn có thể lấy danh sách người dùng với bất kỳ thuộc tính Active Directory nào cần thiết.

Để tìm kiếm người dùng theo nhiều thuộc tính cùng lúc (legacyExchangeDN, proxyAddresses, SAMAccountName, Surname, DisplayName, SamAccountName, physicalDeliveryOfficeName, RDN và msExchMailNickname), bạn có thể sử dụng tính năng Ambiguous Name Resolution (ANR):

Get-ADUser -Filter {anr -eq 'John'} | select Name

Mẹo: Khi tra cứu người dùng Active Directory bằng Get-ADUser, từ góc độ hiệu suất, việc chỉ định tiêu chí bằng thuộc tính Filter ưu tiên hơn so với việc dùng pipeline đến cmdlet Where-Object. Trong trường hợp này, việc lọc kết quả chọn lọc sẽ được thực hiện trên domain controller, và tập dữ liệu nhỏ hơn sẽ được truyền đến máy tính của bạn qua mạng.

Bạn có thể sử dụng bộ lọc LDAP trong truy vấn Get-ADUser. Bộ lọc LDAP được chỉ định bằng thuộc tính –LdapFilter.

Get-ADUser -LDAPFilter '(&(department=it)(title=sysops))'

Các ví dụ PowerShell Get-ADUser

Hãy xem thêm một số ví dụ lệnh PowerShell hữu ích để truy vấn người dùng Active Directory với các bộ lọc khác nhau. Bạn có thể kết hợp chúng để lấy danh sách đối tượng người dùng AD cần thiết:

  • Hiển thị người dùng AD có tên bắt đầu bằng Joe:
    Get-ADUser -filter {name -like "Joe*"}
  • Tính tổng số tài khoản người dùng trong Active Directory:
    Get-ADUser -Filter {SamAccountName -like "*"} | Measure-Object
  • Tìm tài khoản người dùng AD bị vô hiệu hóa:
    Get-ADUser -Filter {Enabled -eq "False"} | Select-Object SamAccountName,Name,Surname,GivenName | Format-Table
  • Kiểm tra ngày tạo tài khoản người dùng AD:
    get-aduser -Filter * -Properties Name, WhenCreated | Select name, whenCreated
  • Lấy danh sách người dùng AD mới tạo trong 24h qua:
    $lastday = ((Get-Date).AddDays(-1))
    Get-ADUser -filter {(whencreated -ge $lastday)}
  • Liệt kê tài khoản có mật khẩu hết hạn:
    Get-ADUser -filter {Enabled -eq $True} -properties name,passwordExpired| where {$_.PasswordExpired}|select name,passwordexpired
  • Tạo nhóm người dùng AD động: Bạn có thể dùng cmdlet Get-ADUser và Add-ADGroupMember để tạo nhóm người dùng AD động (tùy thuộc vào thành phố, chức danh, bộ phận, v.v.).
  • Nhiệm vụ: Với danh sách tài khoản người dùng lưu trong file text (mỗi tài khoản một dòng), bạn cần lấy tên công ty của người dùng từ AD và lưu ra file CSV (dễ dàng import vào Excel).
    Import-Csv c:\ps\users_list.csv | ForEach {
    Get-ADUser -identity $_.user -Properties Name, Company |
    Select Name, Company |
    Export-CSV c:\ps\users_ad_list.csv -Append -Encoding UTF8
    }
  • Người dùng chưa đổi mật khẩu domain trong 90 ngày qua:
    $90_Days = (Get-Date).adddays(-90)
    Get-ADUser -filter {(passwordlastset -le $90_days)}
  • Tìm tài khoản không hoạt động (chưa đăng nhập domain quá 180 ngày): Thuộc tính lastLogonTimestamp dùng để lấy lịch sử đăng nhập domain của người dùng.
    $LastLogonDate= (Get-Date).AddDays(-180)
    Get-ADUser -Properties LastLogonTimeStamp -Filter {LastLogonTimeStamp -lt $LastLogonDate } | ?{$_.Enabled –eq $True} | Sort LastLogonTimeStamp| FT Name, @{N='lastlogontimestamp'; E={[DateTime]::FromFileTime($_.lastlogontimestamp)}} -AutoSize
  • Lấy ảnh người dùng từ Active Directory và lưu thành file jpg:
    $usr = Get-ADUser sjoe -Properties thumbnailPhoto
    $usr.thumbnailPhoto | Set-Content sjoe.jpg -Encoding byte
  • Lấy danh sách nhóm AD mà tài khoản người dùng là thành viên:
    Get-AdUser sjoe -Properties memberof | Select memberof -expandproperty memberof
  • Liệt kê người dùng từ OU là thành viên của nhóm bảo mật domain cụ thể:
    Get-ADUser -SearchBase 'OU=Rome,OU=Italy,DC=woshub,DC=com' -Filter * -properties memberof | Where-Object {($_.memberof -like "*CEO*")}
  • Liệt kê tất cả người dùng từ OU, trừ thành viên của nhóm cụ thể:
    $Users = Get-ADUser -filter * -SearchBase ‘OU=Berlin,DC=woshub,DC=com’ -properties memberOf
    ForEach ($User In $Users)
    {
    $Groups = -join @($User.memberOf)
    If ($Groups -notlike '*Domain Admins*')
    {
    $User.Name
    }
    }
  • Xuất danh sách người dùng AD kèm tên Organizational Unit ra bảng Out-GridView:
    get-aduser -filter * -Properties cn,canonicalname | select name,userprincipalname,@{Name="OU";expression={$_.Canonicalname.substring(0,$_.canonicalname.length-$_.cn.length)}}| Out-GridView
  • Kiểm tra tài khoản người dùng AD có tồn tại:
    $SamAccountName='jbrown'
    if (@(Get-ADUser -Filter { SamAccountName -eq $SamAccountName }).Count -eq 0)
    { Write-Host "User $SamAccountName doesn’t exist"}
  • Liệt kê máy tính domain mà người dùng được phép đăng nhập (giới hạn đăng nhập qua thuộc tính LogonWorkstations AD):
    Get-ADUser jbrown -Properties LogonWorkstations | Format-List Name, LogonWorkstations

Mẹo: Cmdlet Get-ADComputer dùng để lấy thuộc tính máy tính hoặc tìm kiếm nhiều máy tính từ Active Directory.