Khoa học công nghệ

Cách tạo Báo cáo Kiểm kê Windows Server Miễn phí với PowerShell

Logo Powershell

PowerShell được sử dụng bởi nhiều quản trị viên máy chủ. Đương nhiên, một trong những nhiệm vụ được sử dụng nhiều nhất là khả năng xây dựng các tập lệnh và chức năng để kiểm kê các máy chủ của bạn và hiểu môi trường của bạn có những gì.

Mặc dù có nhiều cách để thực hiện điều này, với mức độ phức tạp khác nhau, chúng tôi sẽ xây dựng một Báo cáo kiểm kê Windows Server khá đơn giản nhưng hiệu quả trong bài viết này.

Điều kiện tiên quyết

Bài viết này sẽ được thực hành. Nếu bạn có ý định làm theo, trước tiên hãy đảm bảo rằng bạn có các điều kiện tiên quyết sau:

  • Làm việc trên PC chạy Windows 10 được tham gia miền Active Directory (AD)
  • Đã cài đặt mô-đun ActiveDirectory PowerShell từ bộ công cụ RSAT.
  • Có quyền truy vấn tài khoản máy tính AD
  • Có thể chạy các truy vấn WMI / CIM từ xa đối với các máy tính từ xa
  • Có sẵn PowerShell Remoting trên máy tính từ xa

Truy xuất Máy chủ

Nền tảng cho tập lệnh mà chúng tôi đang xây dựng là chính các máy chủ. Bạn có thể viết chúng ra một cách riêng lẻ trong một tệp văn bản được đọc trong hoặc trong một mảng trong chính tập lệnh nhưng sử dụng PowerShell, chúng tôi có thể làm điều đó tốt hơn. Để làm cho tập lệnh trở nên năng động hơn và không yêu cầu chúng tôi sửa đổi nó bất cứ khi nào máy chủ mới được thêm vào, chúng tôi có thể sử dụng Active Directory (AD) để kéo danh sách các đối tượng máy tính trong một đơn vị tổ chức nhất định (OU).

Dưới đây, chúng tôi đang sử dụng ActiveDirectory mô-đun, có sẵn trong bộ công cụ RSAT, để truy vấn Servers OU và truy xuất tất cả các đối tượng máy tính ở đó thông qua Get-ADComputer.

Import-Module ActiveDirectory

$OU = 'OU=Servers,DC=domain,DC=local'

$Params = @{
    "SearchBase" = $OU
    "Filter"     = '*'
}

$Servers = Get-ADComputer @Params

Tại thời điểm này, chúng tôi có thể chỉ lọc ra thuộc tính name để điền vào $servers , nhưng thường rất hữu ích khi có toàn bộ đối tượng được trả về để sử dụng sau này.

Xác định dữ liệu cần thu thập

Bây giờ chúng tôi đã có các máy chủ của mình, chúng tôi cần tìm ra chính xác những gì chúng tôi nên thu thập từ mỗi máy chủ. Một lý do có thể quan trọng để giữ đối tượng AD đầy đủ là kết hợp dữ liệu đó với dữ liệu trực tiếp từ chính máy chủ để có được bức tranh toàn cảnh hơn về môi trường của bạn.

Trong thực tế, một cái gì đó như thế này trông như thế nào? Hãy liệt kê một số thuộc tính sẽ rất hữu ích để biết.

Giá trị máy chủ

  • Tên Máy chủ Máy chủ
  • Không gian trống của đĩa
  • Ký ức
  • Kết nối mạng

Giá trị quảng cáo

  • Mật khẩu đặt cuối cùng
  • Lần đăng nhập cuối cùng
  • Tên máy chủ DNS

Truy xuất thông tin máy chủ

Làm cách nào để chúng tôi thu thập thông tin này trên danh sách các máy chủ được trả lại? Vì chúng tôi có một danh sách các máy chủ, chúng tôi sẽ phải lặp lại $Servers đối tượng và truy vấn. Bắt đầu với một đơn giản Foreach-Object vòng lặp bên dưới, chúng ta có thể tạo một đối tượng tùy chỉnh để giữ các giá trị của chúng ta.

$Servers | Foreach-Object {
    [PSCustomObject]@{
        "ServerHostName"     = $_.Name
        "Description"        = $_.Description
        "FreeDiskSpace"      = $Null
        "TotalMemory"        = $Null
        "NetworkConnections" = $Null
        "PasswordLastSet"    = $_.pwdLastSet
        "LastLogon"          = $_.lastLogon
        "DNSHostName"        = $_.DNSHostName
        "CreationDate"       = $_.WhenCreated
    }
}

Như bạn có thể nói, bằng cách lưu đối tượng đầy đủ từ Active Directory khi chúng tôi truy xuất máy tính lần đầu tiên, cho phép chúng tôi điền vào một loạt các thông tin. Thật không may, đây không phải là tất cả thông tin mà chúng tôi cần.

Để lấy thông tin từ mỗi máy chủ, chúng tôi sẽ sử dụng một giao diện quen thuộc với nhiều quản trị viên máy chủ, đó là giao diện Windows Management Instrumentation (WMI). Bạn có thể nhận thấy rằng các lệnh ghép ngắn được sử dụng bên dưới là từ giao diện Mô hình Thông tin Chung (CIM), trong đó WMI là cách Microsoft triển khai tiêu chuẩn này.

Nhận dung lượng đĩa trống

Sử dụng lớp WMI có sẵn của Win32_LogicalDisk, chúng tôi có thể lấy tất cả các đĩa có sẵn và dung lượng trống của chúng. Khi chúng tôi chạy lệnh lần đầu tiên, Get-CimInstance -ClassName Win32_LogicalDisk, bạn có thể nhận thấy rằng nó không thể đọc được chính xác trong đầu ra mặc định của nó.

Vấn đề thứ hai ở đây là chúng tôi có nhiều hơn một ổ đĩa được trả về. Tôi muốn biết về từng ổ đĩa đó và dung lượng trống khả dụng tính bằng GB. Hãy sửa đổi mã để thực hiện một số chuyển đổi và làm cho nó tốt hơn.

$Disks = Get-CimInstance -ClassName Win32_LogicalDisk

$DisksResult = $Disks | Foreach-Object {
    [PSCustomObject]@{
        "Drive"     = $_.DeviceID
        "FreeSpace" = [Math]::Round(($_.FreeSpace / 1GB),2)
    }
}

$DisksResult

Sau khi chúng tôi chạy các lệnh, đầu ra của chúng tôi sạch hơn nhiều và bây giờ có thể được sử dụng trong tập lệnh của chúng tôi.

Nhưng điều gì sẽ xảy ra nếu chúng ta muốn cảnh báo về tình trạng dung lượng ổ đĩa thấp? Sẽ rất tuyệt nếu chỉ mở rộng điều này một chút để đặt cờ trên mỗi ổ đĩa đáp ứng điều kiện đó. So sánh dung lượng trống với tổng dung lượng khả dụng, chúng ta có thể biết dung lượng trống dưới 10% hay 10 GB. Lý do cho -or điều kiện là trên các đĩa rất lớn, 10% có thể vẫn rất hào phóng, vì vậy việc đặt giới hạn tuyệt đối sẽ giúp ích.

$Disks = Get-CimInstance -ClassName Win32_LogicalDisk

$DisksResult = $Disks | Foreach-Object {
  $FreeSpace  = [Math]::Round(($_.FreeSpace / 1GB),2)
  $TotalSpace = [Math]::Round(($_.Size / 1GB),2)

  If ( ($FreeSpace / $TotalSpace -LT 0.10) -Or $FreeSpace -LT 10 ) {
    $LowDiskSpace = $True
  } Else {
    $LowDiskSpace = $False
  }

    [PSCustomObject]@{
        "Drive"        = $_.DeviceID
    "FreeSpace"    = $FreeSpace
    "LowDiskSpace" = $LowDiskSpace
    }
}

$DisksResult

Như bạn có thể nói bây giờ, chúng tôi có một tập hợp thông tin tuyệt vời cần được lưu với các máy chủ của chúng tôi.

How% 20to% 20Build% 20a% 20Windows% 20Server% 20Inventory% 20Report% 20for / Untitled% 202.png? Trim = 1,1 & bg-color = 000 & pad = 1,1

Nhận bộ nhớ có sẵn

Thật tiện lợi khi biết lượng RAM được phân bổ cho mỗi máy chủ, đặc biệt là trong môi trường máy ảo. Nếu bạn thấy rằng một số được cấp phép quá mức, bạn có thể tiết kiệm các tài nguyên quý giá bằng cách định kích thước phù hợp các máy chủ. Rất may, việc lấy lại đơn giản hơn nhiều.

Sử dụng Win32_PhysicalMemory Lớp WMI, chúng tôi có thể tổng hợp tất cả các Capacity thuộc tính để lấy tổng bộ nhớ.

(Get-CimInstance -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1GB

Nhận tất cả các kết nối mạng

Cuối cùng, chúng tôi muốn truy xuất tất cả các kết nối mạng với nhau. Điều này rất hữu ích để biết liệu một máy chủ nhất định có nhiều giao diện cần phải lo lắng hay không. Sử dụng một cơ chế hơi khác lần này, chúng tôi đang sử dụng Get-NetAdapter cmdlet, nhưng vì cái này không có ComputerName , chúng tôi sẽ sử dụng PS Remoting để gọi nó cục bộ trên máy chủ đích và trả về kết quả cho tập lệnh của chúng tôi.

$NetworkConnections = Invoke-Command -ComputerName $_.DnsHostName -ScriptBlock {
    Get-NetAdapter -Physical | Select-Object Name, Status, LinkSpeed
}

Đầu ra của chúng ta sẽ giống như bên dưới và sau đó chúng ta có thể lưu nó vào tập lệnh của mình.

Hãy ghi nhớ rằng Invoke-Command để hoạt động, PS Remoting sẽ cần được thiết lập trên các máy chủ đích.

Để tất cả chúng cùng nhau

Bây giờ chúng ta đã có tất cả các mảnh, hãy ghép tất cả lại với nhau. Tập lệnh cuối cùng nằm bên dưới và kết hợp tất cả mã để tạo đối tượng đầu ra tùy chỉnh chỉ với những gì chúng tôi muốn báo cáo.

Import-Module ActiveDirectory

$OU = 'OU=Servers,DC=domain,DC=local'

$Params = @{
    "SearchBase" = $OU
    "Filter"     = '*'
}

$Servers = Get-ADComputer @Params

$Servers | Foreach-Object {
  $Disks = Get-CimInstance -ComputerName $_.DnsHostName -ClassName Win32_LogicalDisk

  $DisksResult = $Disks | Foreach-Object {
    [PSCustomObject]@{
      "Drive"     = $_.DeviceID
      "FreeSpace" = [Math]::Round(($_.FreeSpace / 1GB),2)
    }
  }
  
  $NetworkConnections = Invoke-Command -ComputerName $_.DnsHostName -ScriptBlock {
    Get-NetAdapter -Physical | Select-Object Name, Status, LinkSpeed
  }

    [PSCustomObject]@{
        "ServerHostName"     = $_.Name
        "Description"        = $_.Description
        "FreeDiskSpace"      = $DisksResult
        "TotalMemory"        = ((Get-CimInstance -ComputerName $_.DnsHostName -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1GB)
        "NetworkConnections" = $NetworkConnections
        "PasswordLastSet"    = $_.pwdLastSet
        "LastLogon"          = $_.lastLogon
        "DNSHostName"        = $_.DNSHostName
        "CreationDate"       = $_.WhenCreated
    }
}

Phần kết luận

Những gì chúng tôi đã chứng minh ở đây chỉ là phần nổi của tảng băng chìm về những gì có thể được xây dựng cho một báo cáo hàng tồn kho. Có nhiều thuộc tính hữu ích hơn mà bạn có thể thêm vào báo cáo này. Tiến xa hơn, bạn có thể xây dựng nó thành một trang HTML, lên lịch tác vụ để chạy nó hàng tuần hoặc thậm chí bọc nó trong các công cụ khác như Ansible.

PowerShell giúp bạn dễ dàng thu thập tất cả thông tin bạn cần tập hợp vào một nơi. Sau khi bạn phân tích môi trường của mình và xác định những gì bạn cần biết, hãy xây dựng báo cáo trong PowerShell để giúp chứng minh khả năng kiểm tra môi trường của bạn trong tương lai.

Leave a Comment

Stt buồn về cuộc sống mới nhất 2021