Tìm kiếm trang web

Quản lý quản trị viên cục bộ bằng PowerShell


Trong HTA, tôi đã sử dụng ADSI để kết nối với máy tính từ xa và lấy tài khoản quản trị viên cục bộ. Đối tượng bạn nhận được có thuộc tínhPasswordAge là số giây kể từ khi mật khẩu được thay đổi. Đây là một mẫu mã.

$computers="chi-win8-01","chi-win81","chi-core01","chi-fp02","chi-hvr2"
$account="administrator"
#get password age
$computers | foreach {
 [int]$Age = ([adsi]"WinNT://$_/$account,user").passwordage.value/86400
 $LastChange=(Get-Date).AddHours(-$age)
 New-Object -TypeName PSObject -Property @{
  Computername = $_
  Account = $Account
  Age = $Age
  LastChange = $LastChange
 }
}

Trong ví dụ này tôi đang xác định danh sách tên. Nhưng bạn có thể dễ dàng đọc nội dung của tệp văn bản bằng Get-Content hoặc truy vấn Active Directory. Vì bạn có thể đã đổi tên tài khoản quản trị viên hoặc có lẽ bạn cần kiểm tra một tài khoản cục bộ khác nên tôi đã tạo một biến cho tên tài khoản. Sau đó, PowerShell lấy từng tên máy tính và xây dựng kết nối ADSI tới tài khoản quản trị viên, lấy giá trị mật khẩu và chia cho số giây trong một ngày. Vì vậy, $Age sẽ trở thành tuổi mật khẩu tài khoản tính theo ngày. Vì PowerShell chủ yếu là về các đối tượng nên tôi tạo một đối tượng tùy chỉnh với một số thông tin liên quan. Đây là kết quả.

Bạn có thể thắc mắc tại sao tôi lại sử dụng ForEach-Object thay vì bộ liệt kê ForEach. Đó là bởi vì cái sau không ghi bất kỳ thứ gì vào quy trình và tôi có thể muốn lưu kết quả vào tệp văn bản hoặc xuất sang CSV.

$computers="chi-win8-01","chi-win81","chi-core01","chi-fp02","chi-hvr2"
$account="administrator"
#get password age
$computers | foreach {
 [int]$Age = ([adsi]"WinNT://$_/$account,user").passwordage.value/86400
 $LastChange=(Get-Date).AddHours(-$age)
 New-Object -TypeName PSObject -Property @{
  Computername = $_
  Account = $Account
  Age = $Age
  LastChange = $LastChange
 }
} | Export-CSV -path c:\work\local-admin-report.csv -notypeinformation

Xin lưu ý rằng tôi chỉ trình bày một số ví dụ về PowerShell. Lý tưởng nhất là bạn muốn xây dựng một công cụ lấy thông tin mật khẩu mà bạn có thể kết hợp với các công cụ PowerShell khác. Trên thực tế, những gì tôi đưa cho bạn gần như đã trở thành một hàm rồi nhưng tôi sẽ để bạn xem liệu bạn có thể giải quyết được nó hay không. Bạn muốn có thể chạy một lệnh như thế này:

get-content computers.txt | get-localpasswordAge | export-csv -path c:\work\age.csv

Lệnh giữa là công cụ bạn sẽ xây dựng.

Bây giờ, việc thay đổi mật khẩu thì sao? Điều đó cũng có thể được thực hiện bằng lệnh một dòng.

([adsi]"WinNT://COMPUTER01/administrator,user").setpassword("P@ssw0rd")

Nếu bạn muốn thay đổi mật khẩu cho tất cả các máy mà bạn đã báo cáo, sẽ không mất nhiều công sức để sửa đổi mã “get”. Vì vậy, bạn thấy đấy, việc sử dụng ADSI trong PowerShell cũng dễ dàng như sử dụng nó trong VBScript, nếu không muốn nói là dễ dàng hơn.

Có một số lưu ý:

  • Đừng quên rằng biệt danh WinNT phân biệt chữ hoa chữ thường.
  • Không có cách nào dễ dàng để sử dụng thông tin xác thực thay thế.
  • Không có hỗ trợ WhatIf, trừ khi bạn viết một tập lệnh cung cấp nó.

Các mẫu mã của tôi ở đây nhằm mục đích giáo dục. Bạn nên dành thời gian để xây dựng và thử nghiệm một giải pháp mạnh mẽ hơn dựa trên nhu cầu của mình. Vì vậy, lần tới khi bạn nghĩ mình cần VBScript, hãy dừng lại và chuyển sang PowerShell Place.

Bài viết liên quan