Bạn có thể lưu trữ nhiều thông tin hữu ích trong thuộc tính Description của đối tượng máy tính trong Active Directory. Ví dụ: thông tin về mẫu máy tính, kiểm kê phần cứng hoặc tên người dùng đăng nhập gần nhất. Trong bài viết này, chúng ta sẽ xem cách tự động điền và cập nhật thông tin vào trường Description của đối tượng máy tính trong Active Directory bằng PowerShell.
Cập nhật trường Description của máy tính trong Active Directory với PowerShell
Ví dụ, bạn muốn trường Description cho các máy tính và máy chủ trong bảng điều khiển Active Directory Users and Computers hiển thị thông tin về nhà sản xuất, mẫu máy và số serial. Bạn có thể lấy thông tin này trên máy cục bộ từ WMI bằng lệnh PowerShell sau:
Get-WMIObject Win32_ComputerSystemProduct | Select Vendor, Name, IdentifyingNumber
Truy vấn WMI trả về dữ liệu sau:
- Vendor – HP
- Name – Proliant DL 360 G5
- IdentifyingNumber – CZJ733xxxx

Lấy tên máy tính hiện tại từ biến môi trường và gán vào biến $computer:
$computer = $env:COMPUTERNAME
Sau đó lưu thông tin phần cứng của máy tính:
$computerinfo = Get-WMIObject Win32_ComputerSystemProduct
$Vendor = $computerinfo.vendor
$Model = $computerinfo.Name
$SerialNumber = $computerinfo.identifyingNumber
Kiểm tra các giá trị được gán cho các biến:
$computer
$vendor
$Model
$SerialNumber
Cuối cùng, ghi dữ liệu nhận được vào trường Description của tài khoản máy tính trong Active Directory. Chạy script PowerShell sau:
$ComputerSearcher = New-Object DirectoryServices.DirectorySearcher
$ComputerSearcher.SearchRoot = "LDAP://$("DC=$(($ENV:USERDNSDOMAIN).Replace(".",",DC="))")"
$ComputerSearcher.Filter = "(&(objectCategory=Computer)(CN=$Computer))"
$computerObj = [ADSI]$ComputerSearcher.FindOne().Path
$computerObj.Put("Description", "$vendor|$Model|$SerialNumber")
$computerObj.SetInfo()
Bạn cũng có thể thay đổi mô tả máy tính bằng cmdlet Set-ADComputer. Tuy nhiên, điều này yêu cầu cài đặt Module Active Directory cho Windows PowerShell (từ bộ công cụ quản trị RSAT) trên máy tính.
Set-ADComputer $computer –Description "$vendor|$Model|$SerialNumber”
Nếu bạn muốn sử dụng các cmdlet từ module AD PowerShell, bạn có thể sao chép các file module đến tất cả các máy tính mà không cần cài đặt RSAT.
Kiểm tra xem trường Description của máy tính trong bảng điều khiển ADUC có hiển thị thông tin nhà sản xuất và mẫu mã hay không.

Script như vậy chỉ cập nhật thuộc tính description của máy tính hiện tại trong AD. Bạn có thể điền Description từ xa cho tất cả các máy tính trong domain bằng Get-ADComputer và vòng lặp foreach. Nhưng việc để các máy tính tự động cập nhật thông tin của chúng trong AD khi người dùng đăng nhập hoặc máy tính khởi động sẽ thuận tiện hơn nhiều.
Để làm được điều này, bạn cần tạo một Group Policy với script đăng nhập PowerShell và áp dụng nó cho tất cả các máy tính:
- Mở bảng điều khiển Quản lý Group Policy của domain (
gpmc.msc), tạo một GPO và gán nó cho OU chứa máy tính; - Mở rộng GPO: User Configuration -> Policies -> Windows Settings -> Scripts (Logon / Logoff) -> Logon;
- Chuyển sang tab PowerShell Scripts;
- Nhấn nút Show Files và tạo file FillCompDesc.ps1 với mã sau:
Bạn có thể tùy chọn ghi log hành động của script PowerShell để dễ dàng khắc phục sự cố.# ghi thông tin phần cứng/mẫu máy tính vào trường Description trong Active Directory $computer = $env:COMPUTERNAME $computerinfo = Get-WMIObject Win32_ComputerSystemProduct $Vendor = $computerinfo.vendor $Model = $computerinfo.Name $SerialNumber = $computerinfo.identifyingNumber $DNSDOMAIN = (Get-WmiObject -Namespace root\cimv2 -Class Win32_ComputerSystem).Domain $ComputerSearcher = New-Object DirectoryServices.DirectorySearcher $ComputerSearcher.SearchRoot = "LDAP://$("DC=$(($DNSDOMAIN).Replace(".",",DC="))")" $ComputerSearcher.Filter = "(&(objectCategory=Computer)(CN=$Computer))" $computerObj = [ADSI]$ComputerSearcher.FindOne().Path $computerObj.Put("Description", "$vendor|$Model|$SerialNumber") $computerObj.SetInfo() - Nhấn nút Add và đặt các tham số script sau:
Script name:FillCompDesc.ps1
Script Parameters:-ExecutionPolicy Bypass
Trong trường hợp này, bạn không cần thay đổi cài đặt chính sách thực thi PowerShell hoặc ký file script PS1 để chạy script PowerShell.
- Ủy quyền quyền AD cho một OU cụ thể cho nhóm domain Authenticated Users. Gán quyền thay đổi thuộc tính Description của tất cả đối tượng Computer trong OU (quyền
Write Description). Điều này sẽ cho phép người dùng và máy tính trong domain thay đổi giá trị trong thuộc tính Description của đối tượng máy tính;
- Sau khi khởi động lại các máy tính trong OU đích và cập nhật cài đặt Group Policy, trường Description trong AD sẽ được tự động điền. Trường này sẽ chứa thông tin phần cứng của máy tính. Bạn có thể khắc phục sự cố GPO bằng công cụ
gpresulthoặc sử dụng các mẹo từ bài viết "Common problems causing group policy to not apply".
Như vậy, bạn có thể thêm bất kỳ thông tin nào vào trường Description của đối tượng máy tính trong AD. Ví dụ: tên người dùng đăng nhập gần nhất, phòng ban (bạn có thể lấy thông tin này bằng cmdlet Get-ADUser), địa chỉ IP của máy tính hoặc bất kỳ thông tin liên quan nào khác bạn cần.
Lưu ý. Nhược điểm của cách tiếp cận này là bất kỳ người dùng AD đã xác thực nào cũng có thể thay đổi hoặc xóa mô tả của bất kỳ máy tính nào trong Active Directory.
Thêm tên người dùng đăng nhập gần nhất vào mô tả máy tính trong AD
Script PowerShell ở trên có thể được sử dụng để thêm bất kỳ thông tin nào khác vào mô tả của đối tượng máy tính trong AD. Ví dụ, rất hữu ích khi mô tả máy tính hiển thị người dùng hiện đang đăng nhập. Hãy cũng thêm tên bộ điều khiển domain mà người dùng được xác thực trên đó (LOGONSERVER).
Thay đổi một dòng trong script đăng nhập PowerShell thành:
$computerObj.Put("Description","$vendor|$Model|$SerialNumber|$env:username|$env:LOGONSERVER")
Đăng xuất và đăng nhập lại dưới tài khoản người dùng của bạn. Kiểm tra xem thuộc tính mô tả máy tính hiện tại có hiển thị tên người dùng hiện tại và logonserver (bộ điều khiển domain) bạn được xác thực hay không.

Để phân tích dữ liệu từ thuộc tính Description, bạn có thể sử dụng mã PowerShell sau:
$ComputerName = 'PC-MUN22s7b2'
$vendor,$Model,$SerialNumber,$Username,$LogonServer = ((Get-ADComputer -identity $ComputerName -Properties *).description).split("|")
Chúng ta tách giá trị trường Description (được phân tách bằng |) thành nhiều biến riêng biệt. Để lấy tên người dùng trên máy tính từ xa được chỉ định, chỉ cần chạy:
$Username

Bạn có thể lấy tên máy tính mà một người dùng cụ thể hiện đang đăng nhập bằng script PowerShell sau:
$user='*M.Becker*'
Get-ADComputer -Filter "description -like '$user'" -properties * | select name,description | ft