PowerShell 技能连载 - PowerCLI:管理VMware的简便方法

简介

踏上穿越 VMware 虚拟景观的迷人旅程可能是一项艰巨的任务。别害怕,亲爱的管理员们,PowerCLI 将改变您的 VMware 管理体验。作为多年来在这些虚拟领域中航行过的人,我将引导您了解 PowerShell 的复杂之处。

使用 PowerCLI 入门

安装 PowerShell 模块

在深入研究 PowerCLI 魔法之前,请确保已安装必要的模块。对于 VMware 管理,您需要安装 VMware PowerCLI 模块。使用以下 PowerShell 命令进行安装:

Install-Module -Name VMware.PowerCLI -Force -AllowClobber

来源: PowerShell Gallery (powershellgallery.com)

此命令获取并安装 VMware PowerCLI 模块,这是管理虚拟环境所需的先决条件。

连接到您的 VMware 环境

一旦模块被安装,您可以使用以下命令连接到您的 VMware 环境:

Connect-VIServer -Server YourVMwareServer -User YourUsername -Password YourPassword

来源: VMware PowerCLI 文档 (code.vmware.com)

用实际服务器详细信息替换 “YourVMwareServer,” “YourUsername,” 和 “YourPassword” 。这将建立与您的 VMware 环境之间的连接。

PowerCLI:虚拟管理的交响乐

VM概览的基本命令

让我们从微软官方 PowerShell 文档中提取的一个基本命令开始:

1
Get-VM

来源: 微软 PowerShell 文档 (docs.microsoft.com)

这个一行代码可以直接从 PowerShell 的圣典中为您提供 VMware 环境中所有虚拟机的全面列表。

使用 Where-Object 进行结果细化

有时,您只需要特定信息。PowerShell 可以帮到你!使用 Where-Object 命令来过滤结果。例如,让我们找出具有超过 4 GB RAM 的 VM:

Get-VM | Where-Object {$_.MemoryGB -gt 4}

来源: PowerShell.org 社区论坛 (powershell.org)

这段代码可帮助您识别具有超过 4 GB RAM 的 VM,这是从 PowerShell 社区汲取的智慧之源。

快照简化处理

管理快照至关重要,而 VMware 官方文档提供了一个珍贵建议:

Get-VM "YourVMName" | New-Snapshot -Name "SnapshotName" -Description "SnapshotDescription"

来源: VMware PowerCLI 文档 (code.vmware.com)

在此处,我们创建了一个带名称和描述的快照,遵循了 VMware 最佳实践。

使用 Set-VM 进行动态资源管理

调整 VM 资源是一个强大功能,并且来自 VMware 的文档帮助我们掌握这种力量:

Set-VM -Name "YourVMName" -MemoryGB 8 -NumCPU 2

来源: VMware PowerCLI 文档 (code.vmware.com)

这个一行代码展示了在 VMware 中使用 PowerShell CLI 实现无缝资源管理能力。

使用 Invoke-VMScript 在 VM 内运行命令

要在 VM 内部执行命令,请参考 VMware 知识库:

Invoke-VMScript -VM "YourVMName" -ScriptText "YourScript" -GuestCredential (Get-Credential)

此片段使您可以安全地在 VM 中运行脚本或命令。

结论

当您开始使用PowerCLI在VMware中进行这段神奇的旅程时,请记住每个命令都是您虚拟魔法书中的一个咒语。本指南取自权威来源,只是您PowerShell冒险之旅的开端。定制、实验,并让魔法流淌在您的虚拟领域中。您的VMware管理即将变得不仅高效,而且真正迷人。祝编写脚本愉快!

PowerShell 技能连载 - 高级跨平台功能实现

在PowerShell Core的支持下,我们可以实现更高级的跨平台功能。本文将介绍如何在Windows、Linux和macOS上实现GUI开发、数据库操作、网络编程、文件系统监控和日志管理等高级功能。

跨平台GUI开发

使用.NET Core的跨平台GUI框架,我们可以创建在多个平台上运行的图形界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
function New-CrossPlatformGUI {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$Title,

[Parameter()]
[int]$Width = 800,

[Parameter()]
[int]$Height = 600,

[Parameter()]
[scriptblock]$OnLoad,

[Parameter()]
[scriptblock]$OnClose
)

try {
# 检查是否安装了必要的模块
if (-not (Get-Module -ListAvailable -Name "Avalonia")) {
Write-Host "正在安装Avalonia模块..."
Install-Module -Name "Avalonia" -Scope CurrentUser -Force
}

# 创建主窗口
$window = New-Object Avalonia.Window
$window.Title = $Title
$window.Width = $Width
$window.Height = $Height

# 创建主布局
$grid = New-Object Avalonia.Controls.Grid
$grid.RowDefinitions.Add("Auto")
$grid.RowDefinitions.Add("*")

# 创建标题栏
$titleBar = New-Object Avalonia.Controls.TextBlock
$titleBar.Text = $Title
$titleBar.FontSize = 16
$titleBar.Margin = "10"
$grid.Children.Add($titleBar)

# 创建内容区域
$content = New-Object Avalonia.Controls.StackPanel
$grid.Children.Add($content)

# 设置窗口内容
$window.Content = $grid

# 注册事件处理程序
if ($OnLoad) {
$window.Loaded += $OnLoad
}

if ($OnClose) {
$window.Closing += $OnClose
}

# 显示窗口
$window.Show()

return $window
}
catch {
Write-Error "创建GUI失败:$_"
return $null
}
}

# 示例:创建一个简单的跨平台GUI应用
$window = New-CrossPlatformGUI -Title "跨平台PowerShell应用" `
-Width 400 `
-Height 300 `
-OnLoad {
Write-Host "窗口已加载"
} `
-OnClose {
Write-Host "窗口已关闭"
}

跨平台数据库操作

使用.NET Core的数据库提供程序,我们可以实现跨平台的数据库操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
function Connect-CrossPlatformDatabase {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[ValidateSet("SQLite", "PostgreSQL", "MySQL", "MongoDB")]
[string]$DatabaseType,

[Parameter(Mandatory = $true)]
[string]$ConnectionString,

[Parameter()]
[switch]$UseConnectionPooling
)

try {
$connection = $null

switch ($DatabaseType) {
"SQLite" {
$connection = New-Object Microsoft.Data.Sqlite.SqliteConnection($ConnectionString)
}
"PostgreSQL" {
$connection = New-Object Npgsql.NpgsqlConnection($ConnectionString)
}
"MySQL" {
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection($ConnectionString)
}
"MongoDB" {
$connection = New-Object MongoDB.Driver.MongoClient($ConnectionString)
}
}

if ($UseConnectionPooling) {
$connection.ConnectionString += ";Pooling=true"
}

$connection.Open()
Write-Host "成功连接到 $DatabaseType 数据库" -ForegroundColor Green

return $connection
}
catch {
Write-Error "数据库连接失败:$_"
return $null
}
}

function Invoke-CrossPlatformQuery {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
$Connection,

[Parameter(Mandatory = $true)]
[string]$Query,

[Parameter()]
[hashtable]$Parameters
)

try {
$command = $Connection.CreateCommand()
$command.CommandText = $Query

if ($Parameters) {
foreach ($param in $Parameters.GetEnumerator()) {
$dbParam = $command.CreateParameter()
$dbParam.ParameterName = $param.Key
$dbParam.Value = $param.Value
$command.Parameters.Add($dbParam)
}
}

$result = $command.ExecuteReader()
$dataTable = New-Object System.Data.DataTable
$dataTable.Load($result)

return $dataTable
}
catch {
Write-Error "查询执行失败:$_"
return $null
}
}

# 示例:使用SQLite数据库
$connection = Connect-CrossPlatformDatabase -DatabaseType "SQLite" `
-ConnectionString "Data Source=test.db" `
-UseConnectionPooling

$result = Invoke-CrossPlatformQuery -Connection $connection `
-Query "SELECT * FROM Users WHERE Age > @Age" `
-Parameters @{
"Age" = 18
}

跨平台网络编程

使用.NET Core的网络库,我们可以实现跨平台的网络通信:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
function New-CrossPlatformWebServer {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$Url,

[Parameter()]
[scriptblock]$RequestHandler,

[Parameter()]
[int]$MaxConnections = 100
)

try {
$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add($Url)
$listener.Start()

Write-Host "Web服务器已启动,监听地址:$Url" -ForegroundColor Green

while ($true) {
$context = $listener.GetContext()
$request = $context.Request
$response = $context.Response

# 处理请求
if ($RequestHandler) {
$RequestHandler.Invoke($request, $response)
}
else {
$response.StatusCode = 200
$response.ContentType = "text/plain"
$responseString = "Hello from PowerShell Web Server!"
$buffer = [System.Text.Encoding]::UTF8.GetBytes($responseString)
$response.ContentLength64 = $buffer.Length
$response.OutputStream.Write($buffer, 0, $buffer.Length)
}

$response.Close()
}
}
catch {
Write-Error "Web服务器启动失败:$_"
return $null
}
}

function Send-CrossPlatformHttpRequest {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$Url,

[Parameter()]
[ValidateSet("GET", "POST", "PUT", "DELETE")]
[string]$Method = "GET",

[Parameter()]
[hashtable]$Headers,

[Parameter()]
[string]$Body
)

try {
$client = New-Object System.Net.Http.HttpClient

if ($Headers) {
foreach ($header in $Headers.GetEnumerator()) {
$client.DefaultRequestHeaders.Add($header.Key, $header.Value)
}
}

$request = New-Object System.Net.Http.HttpRequestMessage($Method, $Url)

if ($Body) {
$request.Content = New-Object System.Net.Http.StringContent($Body)
}

$response = $client.SendAsync($request).Result
$responseContent = $response.Content.ReadAsStringAsync().Result

return [PSCustomObject]@{
StatusCode = $response.StatusCode
Content = $responseContent
Headers = $response.Headers
}
}
catch {
Write-Error "HTTP请求失败:$_"
return $null
}
}

# 示例:创建Web服务器并发送请求
$server = Start-Job -ScriptBlock {
New-CrossPlatformWebServer -Url "http://localhost:8080/" `
-RequestHandler {
param($request, $response)
$responseString = "收到请求:$($request.Url)"
$buffer = [System.Text.Encoding]::UTF8.GetBytes($responseString)
$response.ContentLength64 = $buffer.Length
$response.OutputStream.Write($buffer, 0, $buffer.Length)
}
}

Start-Sleep -Seconds 2

$result = Send-CrossPlatformHttpRequest -Url "http://localhost:8080/" `
-Method "GET" `
-Headers @{
"User-Agent" = "PowerShell Client"
}

跨平台文件系统监控

使用.NET Core的文件系统监控功能,我们可以实现跨平台的文件系统事件监控:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
function Start-CrossPlatformFileWatcher {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$Path,

[Parameter()]
[ValidateSet("Created", "Changed", "Deleted", "Renamed", "All")]
[string[]]$Events = @("All"),

[Parameter()]
[string]$Filter = "*.*",

[Parameter()]
[switch]$IncludeSubdirectories,

[Parameter()]
[scriptblock]$OnEvent
)

try {
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $Path
$watcher.Filter = $Filter
$watcher.IncludeSubdirectories = $IncludeSubdirectories
$watcher.EnableRaisingEvents = $true

# 注册事件处理程序
if ($Events -contains "All" -or $Events -contains "Created") {
$watcher.Created += {
if ($OnEvent) {
$OnEvent.Invoke("Created", $EventArgs)
}
}
}

if ($Events -contains "All" -or $Events -contains "Changed") {
$watcher.Changed += {
if ($OnEvent) {
$OnEvent.Invoke("Changed", $EventArgs)
}
}
}

if ($Events -contains "All" -or $Events -contains "Deleted") {
$watcher.Deleted += {
if ($OnEvent) {
$OnEvent.Invoke("Deleted", $EventArgs)
}
}
}

if ($Events -contains "All" -or $Events -contains "Renamed") {
$watcher.Renamed += {
if ($OnEvent) {
$OnEvent.Invoke("Renamed", $EventArgs)
}
}
}

Write-Host "文件系统监控已启动,监控路径:$Path" -ForegroundColor Green

return $watcher
}
catch {
Write-Error "文件系统监控启动失败:$_"
return $null
}
}

# 示例:监控文件系统变化
$watcher = Start-CrossPlatformFileWatcher -Path "C:\Temp" `
-Events @("Created", "Changed", "Deleted") `
-Filter "*.txt" `
-IncludeSubdirectories `
-OnEvent {
param($eventType, $eventArgs)
Write-Host "检测到文件系统事件:$eventType" -ForegroundColor Yellow
Write-Host "文件路径:$($eventArgs.FullPath)" -ForegroundColor Cyan
}

跨平台日志管理

使用.NET Core的日志框架,我们可以实现跨平台的日志管理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
function New-CrossPlatformLogger {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$LogPath,

[Parameter()]
[ValidateSet("Debug", "Info", "Warning", "Error", "Critical")]
[string]$LogLevel = "Info",

[Parameter()]
[switch]$EnableConsoleOutput,

[Parameter()]
[switch]$EnableFileOutput,

[Parameter()]
[switch]$EnableJsonFormat
)

try {
$logger = [PSCustomObject]@{
LogPath = $LogPath
LogLevel = $LogLevel
EnableConsoleOutput = $EnableConsoleOutput
EnableFileOutput = $EnableFileOutput
EnableJsonFormat = $EnableJsonFormat
LogLevels = @{
"Debug" = 0
"Info" = 1
"Warning" = 2
"Error" = 3
"Critical" = 4
}
}

# 创建日志目录
if ($EnableFileOutput) {
$logDir = Split-Path -Parent $LogPath
if (-not (Test-Path $logDir)) {
New-Item -ItemType Directory -Path $logDir -Force | Out-Null
}
}

# 添加日志方法
$logger | Add-Member -MemberType ScriptMethod -Name "Log" -Value {
param(
[string]$Level,
[string]$Message,
[hashtable]$Properties
)

if ($this.LogLevels[$Level] -ge $this.LogLevels[$this.LogLevel]) {
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss.fff"
$logEntry = [PSCustomObject]@{
Timestamp = $timestamp
Level = $Level
Message = $Message
Properties = $Properties
}

if ($this.EnableJsonFormat) {
$logString = $logEntry | ConvertTo-Json
}
else {
$logString = "[$timestamp] [$Level] $Message"
if ($Properties) {
$logString += " | " + ($Properties.GetEnumerator() | ForEach-Object { "$($_.Key)=$($_.Value)" }) -join " "
}
}

if ($this.EnableConsoleOutput) {
switch ($Level) {
"Debug" { Write-Debug $logString }
"Info" { Write-Host $logString -ForegroundColor White }
"Warning" { Write-Host $logString -ForegroundColor Yellow }
"Error" { Write-Host $logString -ForegroundColor Red }
"Critical" { Write-Host $logString -ForegroundColor DarkRed }
}
}

if ($this.EnableFileOutput) {
$logString | Out-File -FilePath $this.LogPath -Append
}
}
}

return $logger
}
catch {
Write-Error "创建日志记录器失败:$_"
return $null
}
}

# 示例:使用日志记录器
$logger = New-CrossPlatformLogger -LogPath "C:\Logs\app.log" `
-LogLevel "Info" `
-EnableConsoleOutput `
-EnableFileOutput `
-EnableJsonFormat

$logger.Log("Info", "应用程序启动", @{
"Version" = "1.0.0"
"Platform" = $PSVersionTable.Platform
})

$logger.Log("Warning", "磁盘空间不足", @{
"Drive" = "C:"
"FreeSpace" = "1.2GB"
})

最佳实践

  1. 使用.NET Core的跨平台API而不是平台特定API
  2. 实现优雅的错误处理和日志记录
  3. 使用连接池和资源管理
  4. 实现适当的超时和重试机制
  5. 使用异步操作提高性能
  6. 实现适当的清理和资源释放
  7. 使用配置文件管理设置
  8. 实现适当的权限检查

PowerShell 技能连载 - 变更管理

在系统管理中,变更管理对于确保系统稳定性和可靠性至关重要。本文将介绍如何使用PowerShell构建一个变更管理系统,包括变更评估、实施和验证等功能。

变更评估

首先,让我们创建一个用于管理变更评估的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
function Assess-SystemChanges {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$AssessmentID,

[Parameter()]
[string[]]$ChangeTypes,

[Parameter()]
[ValidateSet("Full", "Quick", "Custom")]
[string]$AssessmentMode = "Full",

[Parameter()]
[hashtable]$AssessmentConfig,

[Parameter()]
[string]$LogPath
)

try {
$assessor = [PSCustomObject]@{
AssessmentID = $AssessmentID
StartTime = Get-Date
AssessmentStatus = @{}
Changes = @{}
Risks = @()
}

# 获取评估配置
$config = Get-AssessmentConfig -AssessmentID $AssessmentID

# 管理评估
foreach ($type in $ChangeTypes) {
$status = [PSCustomObject]@{
Type = $type
Status = "Unknown"
Config = @{}
Changes = @{}
Risks = @()
}

# 应用评估配置
$typeConfig = Apply-AssessmentConfig `
-Config $config `
-Type $type `
-Mode $AssessmentMode `
-Settings $AssessmentConfig

$status.Config = $typeConfig

# 评估系统变更
$changes = Assess-ChangeImpact `
-Type $type `
-Config $typeConfig

$status.Changes = $changes
$assessor.Changes[$type] = $changes

# 检查变更风险
$risks = Check-ChangeRisks `
-Changes $changes `
-Config $typeConfig

$status.Risks = $risks
$assessor.Risks += $risks

# 更新评估状态
if ($risks.Count -gt 0) {
$status.Status = "HighRisk"
}
else {
$status.Status = "LowRisk"
}

$assessor.AssessmentStatus[$type] = $status
}

# 记录评估日志
if ($LogPath) {
$assessor | ConvertTo-Json -Depth 10 | Out-File -FilePath $LogPath
}

# 更新评估器状态
$assessor.EndTime = Get-Date

return $assessor
}
catch {
Write-Error "变更评估失败:$_"
return $null
}
}

变更实施

接下来,创建一个用于管理变更实施的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
function Implement-SystemChanges {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$ImplementationID,

[Parameter()]
[string[]]$ImplementationTypes,

[Parameter()]
[ValidateSet("Rolling", "BlueGreen", "Canary")]
[string]$ImplementationMode = "Rolling",

[Parameter()]
[hashtable]$ImplementationConfig,

[Parameter()]
[string]$ReportPath
)

try {
$implementer = [PSCustomObject]@{
ImplementationID = $ImplementationID
StartTime = Get-Date
ImplementationStatus = @{}
Implementations = @{}
Actions = @()
}

# 获取实施配置
$config = Get-ImplementationConfig -ImplementationID $ImplementationID

# 管理实施
foreach ($type in $ImplementationTypes) {
$status = [PSCustomObject]@{
Type = $type
Status = "Unknown"
Config = @{}
Implementations = @{}
Actions = @()
}

# 应用实施配置
$typeConfig = Apply-ImplementationConfig `
-Config $config `
-Type $type `
-Mode $ImplementationMode `
-Settings $ImplementationConfig

$status.Config = $typeConfig

# 实施系统变更
$implementations = Implement-ChangeActions `
-Type $type `
-Config $typeConfig

$status.Implementations = $implementations
$implementer.Implementations[$type] = $implementations

# 执行实施动作
$actions = Execute-ImplementationActions `
-Implementations $implementations `
-Config $typeConfig

$status.Actions = $actions
$implementer.Actions += $actions

# 更新实施状态
if ($actions.Count -gt 0) {
$status.Status = "InProgress"
}
else {
$status.Status = "Completed"
}

$implementer.ImplementationStatus[$type] = $status
}

# 生成报告
if ($ReportPath) {
$report = Generate-ImplementationReport `
-Implementer $implementer `
-Config $config

$report | ConvertTo-Json -Depth 10 | Out-File -FilePath $ReportPath
}

# 更新实施器状态
$implementer.EndTime = Get-Date

return $implementer
}
catch {
Write-Error "变更实施失败:$_"
return $null
}
}

变更验证

最后,创建一个用于管理变更验证的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
function Validate-SystemChanges {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$ValidationID,

[Parameter()]
[string[]]$ValidationTypes,

[Parameter()]
[ValidateSet("Full", "Quick", "Custom")]
[string]$ValidationMode = "Full",

[Parameter()]
[hashtable]$ValidationConfig,

[Parameter()]
[string]$ReportPath
)

try {
$validator = [PSCustomObject]@{
ValidationID = $ValidationID
StartTime = Get-Date
ValidationStatus = @{}
Validations = @{}
Issues = @()
}

# 获取验证配置
$config = Get-ValidationConfig -ValidationID $ValidationID

# 管理验证
foreach ($type in $ValidationTypes) {
$status = [PSCustomObject]@{
Type = $type
Status = "Unknown"
Config = @{}
Validations = @{}
Issues = @()
}

# 应用验证配置
$typeConfig = Apply-ValidationConfig `
-Config $config `
-Type $type `
-Mode $ValidationMode `
-Settings $ValidationConfig

$status.Config = $typeConfig

# 验证系统变更
$validations = Validate-ChangeResults `
-Type $type `
-Config $typeConfig

$status.Validations = $validations
$validator.Validations[$type] = $validations

# 检查验证问题
$issues = Check-ValidationIssues `
-Validations $validations `
-Config $typeConfig

$status.Issues = $issues
$validator.Issues += $issues

# 更新验证状态
if ($issues.Count -gt 0) {
$status.Status = "Failed"
}
else {
$status.Status = "Passed"
}

$validator.ValidationStatus[$type] = $status
}

# 生成报告
if ($ReportPath) {
$report = Generate-ValidationReport `
-Validator $validator `
-Config $config

$report | ConvertTo-Json -Depth 10 | Out-File -FilePath $ReportPath
}

# 更新验证器状态
$validator.EndTime = Get-Date

return $validator
}
catch {
Write-Error "变更验证失败:$_"
return $null
}
}

使用示例

以下是如何使用这些函数来管理变更的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# 评估系统变更
$assessor = Assess-SystemChanges -AssessmentID "ASSESSMENT001" `
-ChangeTypes @("Configuration", "Software", "Hardware", "Network") `
-AssessmentMode "Full" `
-AssessmentConfig @{
"Configuration" = @{
"Categories" = @("System", "Application", "Security")
"Attributes" = @("Settings", "Parameters", "Policies")
"Filter" = "Status = Active"
"Retention" = 7
}
"Software" = @{
"Categories" = @("OS", "Application", "Driver")
"Attributes" = @("Version", "Patch", "Update")
"Filter" = "Status = Installed"
"Retention" = 7
}
"Hardware" = @{
"Categories" = @("Server", "Storage", "Network")
"Attributes" = @("Capacity", "Performance", "Compatibility")
"Filter" = "Status = Active"
"Retention" = 7
}
"Network" = @{
"Categories" = @("Topology", "Security", "Performance")
"Attributes" = @("Connectivity", "Bandwidth", "Latency")
"Filter" = "Status = Connected"
"Retention" = 7
}
} `
-LogPath "C:\Logs\change_assessment.json"

# 实施系统变更
$implementer = Implement-SystemChanges -ImplementationID "IMPLEMENTATION001" `
-ImplementationTypes @("Configuration", "Software", "Hardware", "Network") `
-ImplementationMode "Rolling" `
-ImplementationConfig @{
"Configuration" = @{
"Actions" = @("Backup", "Update", "Verify")
"Rollback" = $true
"Timeout" = 300
"Report" = $true
}
"Software" = @{
"Actions" = @("Backup", "Install", "Verify")
"Rollback" = $true
"Timeout" = 600
"Report" = $true
}
"Hardware" = @{
"Actions" = @("Backup", "Replace", "Verify")
"Rollback" = $true
"Timeout" = 900
"Report" = $true
}
"Network" = @{
"Actions" = @("Backup", "Configure", "Verify")
"Rollback" = $true
"Timeout" = 300
"Report" = $true
}
} `
-ReportPath "C:\Reports\change_implementation.json"

# 验证系统变更
$validator = Validate-SystemChanges -ValidationID "VALIDATION001" `
-ValidationTypes @("Configuration", "Software", "Hardware", "Network") `
-ValidationMode "Full" `
-ValidationConfig @{
"Configuration" = @{
"Metrics" = @("Compliance", "Security", "Performance")
"Threshold" = 90
"Interval" = 60
"Report" = $true
}
"Software" = @{
"Metrics" = @("Functionality", "Stability", "Performance")
"Threshold" = 90
"Interval" = 60
"Report" = $true
}
"Hardware" = @{
"Metrics" = @("Availability", "Performance", "Health")
"Threshold" = 90
"Interval" = 60
"Report" = $true
}
"Network" = @{
"Metrics" = @("Connectivity", "Performance", "Security")
"Threshold" = 90
"Interval" = 60
"Report" = $true
}
} `
-ReportPath "C:\Reports\change_validation.json"

最佳实践

  1. 实施变更评估
  2. 管理变更实施
  3. 验证变更结果
  4. 保持详细的变更记录
  5. 定期进行变更审查
  6. 实施回滚策略
  7. 建立变更控制
  8. 保持系统文档更新

使用 PowerShell 和 OpenAI 实现智能脚本生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 配置 OpenAI API 密钥
$openAIKey = 'your-api-key'

function Get-AIScript {
param(
[string]$Prompt
)

$headers = @{
'Authorization' = "Bearer $openAIKey"
'Content-Type' = 'application/json'
}

$body = @{
model = 'gpt-4'
messages = @(
@{
role = 'system'
content = '你是一个 PowerShell 专家,请生成符合最佳实践的脚本。要求:1. 包含错误处理 2. 支持verbose输出 3. 包含帮助文档'
},
@{
role = 'user'
content = $Prompt
}
)
} | ConvertTo-Json

$response = Invoke-RestMethod -Uri 'https://api.openai.com/v1/chat/completions' -Method Post -Headers $headers -Body $body

$response.choices[0].message.content
}

# 示例:生成 AD 用户创建脚本
$prompt = @"
创建 PowerShell 函数 New-ADUserWithValidation,要求:
1. 验证输入的邮箱格式
2. 检查用户名唯一性
3. 自动生成随机初始密码
4. 支持WhatIf参数
"@

Get-AIScript -Prompt $prompt

此脚本演示如何通过 OpenAI API 自动生成符合企业规范的 PowerShell 脚本。通过系统提示词确保生成的脚本包含错误处理、verbose 输出等必要元素。实际使用时可扩展以下功能:

  1. 添加 Azure Key Vault 集成管理 API 密钥
  2. 实现脚本静态分析
  3. 与 CI/CD 流水线集成进行自动测试

PowerShell 技能连载 - 7 个用于管理 DHCP 的最佳 PowerShell 脚本

从DHCP范围获取IP看起来很容易,但当涉及检查每个范围的健康状况时,情况就变得非常困难了,无论是满还是是否需要创建任何超范围。如果您是服务器管理员,您真的知道我在说什么,当客户抱怨他们没有获得任何IP地址时确实很痛苦,并且你会发现在你的范围中一切都是空白。

使DHCP服务器或范围动态更新多个DHCP服务器上的DNS并不容易,并且知道它所处域中确切位置的范围更加艰难。通过Powershellguru,我的目标始终是为我在生产环境中通常遇到的问题提供简单解决方案。以下是一些关于DHCP及其工作原理以及Powershell相关书籍可以参考。希望您喜欢,并且大多数免费软件总是驻留在维基百科和微软网站上。

DHCP有用的Powershell命令

为DHCP服务器服务添加一个对象

1
Add-DhcpServerInDC -DnsName "dhcp.xyz.com"

备份 DHCP 数据库

1
Backup-DhcpServer -ComputerName "dhcp.xyz.com" -Path "%systemroot\dhcp\backup"

导出所有 DHCP 设置

1
Export-DhcpServer -ComputerName "dhcp.xyz.com" -File "path\config.xml"

获取范围内的所有活动租约

1
Get-DhcpServerv4Lease -ComputerName "dhcp.xyz.com" -ScopeId IP

按名称获取策略的属性

1
Get-DhcpServerv4Policy -ComputerName "dhcp.xyz.com" -Name "policyname"

DHCP故障转移

通常创建一个故障转移是更好的选择。所有请求不会只发送到一个特定的DHCP服务器,而是由2台服务器共同管理。

工作原理

此脚本将在两个DHCP服务器之间创建故障转移,我们需要指定范围。稍后,脚本将在这两个DHCP服务器之间创建故障转移。

可能的结果

运行脚本后,请检查故障转移是否正常工作。请求应该同时发送到两台服务器上。

下载

您可以从以下链接下载脚本。

DHCP Failover

DHCP备份

在您的环境中未配置故障转移时,备份DHCP是一个福音。您可以将备份恢复到上次备份的时间点,一切都会重新在线。

工作原理

路径已经设置好了,我们需要在dhcp服务器上运行脚本,这样就会创建一个dhcp的备份。

问题结果

该脚本减少了我们通过GUI手动操作的工作量,并在提供的位置创建了备份。

下载

您可以从下面下载脚本。

备份 DHCP 服务器

DNS 动态更新

IP地址动态分配是DHCP的角色之一,并不会自动启用,需要通过GUI手动完成。但为什么要匆忙去使用GUI呢?当你可以通过Powershell来做时。

工作原理

此脚本将根据需求为范围或所有范围启用DNS动态更新设置。

可能结果

动态更新将被启用,并且对于启用DHCP的机器主机解析将得到纠正。

下载

您可以通过突出显示的链接下载该脚本。

配置 DNS 动态更新

配置租约持续时间

按照微软公司规定,租约持续时间始终设定为8天。但实际情况下我们可能会针对范围进行更改,那么为什么要使用GUI进行操作呢?当我们可以编写一个脚本时。

工作原理

对于提供的范围,您可以使用此脚本设置租约持续时间。

可能的结果

将设置租约持续时间,如果需要,我们可以在任何计算机上进行测试,否则它将按预期工作。

下载

您可以通过突出显示的链接下载该脚本。

配置DHCP租约持续时间

DHCP健康检查

这是最实用的脚本之一,让我们了解范围、子网、是否禁用某个范围等。所有必备且可下载的独特脚本。

工作原理

脚本将扫描给定服务器的范围,并通过邮件发送结果。

可能的结果

我们将收到关于范围详情的信息,这对于了解其中任何一个即将填满的情况很重要。

下载

您可以通过突出显示的链接下载脚本。

DHCP健康检查

创建多个DHCP范围

如果需要创建多个DHCP范围,那么这个脚本就是为您量身定制的,请根据您的需求进行检查。

工作原理

它需要输入并且我们需要提供注释,以便快速创建范围。

可能的结果

所有提供的输入都将用于创建多个DHCP范围,这是一种非常方便实用的脚本。

下载

您可以通过突出显示的链接下载该脚本。

create scope

从多个范围获取路由器详细信息

曾经想过从多个范围中获取路由器IP详细信息吗?好吧,Powershell已经为我们创造了一个拯救生命般存在着这样一个脚本来完成此任务。

工作原理

使用 Get-DhcpServerv4Scope 在文本格式中提供范围ID详情,并且它会从给定范围中获取路由器IP地址。

可能结果

结果将以csv格式呈现,在其中包含有关路由器IP详细信息和其所属ID。

下载

您可以通过以下链接下载该脚本。

router

PowerShell 技能连载 - Microsoft Graph API 集成自动化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
function Manage-Office365Resources {
[CmdletBinding(SupportsShouldProcess=$true)]
param(
[Parameter(Mandatory=$true)]
[ValidateSet('User','Team')]
[string]$ResourceType,

[string]$DisplayName
)

$managementReport = [PSCustomObject]@{
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
Operations = @()
SuccessRate = 0
LicenseDetails = @{}
}

try {
# 获取Graph API访问令牌
$token = Get-MsalToken -ClientId $env:AZURE_CLIENT_ID -TenantId $env:AZURE_TENANT_ID

# 资源操作逻辑
switch ($ResourceType) {
'User' {
$userParams = @{
Method = 'POST'
Uri = "https://graph.microsoft.com/v1.0/users"
Headers = @{ Authorization = "Bearer $($token.AccessToken)" }
Body = @{
accountEnabled = $true
displayName = $DisplayName
mailNickname = $DisplayName.Replace(' ','').ToLower()
userPrincipalName = "$($DisplayName.Replace(' ',''))@$env:AZURE_DOMAIN"
passwordProfile = @{
forceChangePasswordNextSignIn = $true
password = [System.Convert]::ToBase64String((1..12 | ForEach-Object { [char](Get-Random -Minimum 33 -Maximum 126) }))
}
} | ConvertTo-Json
}
$response = Invoke-RestMethod @userParams
$managementReport.Operations += [PSCustomObject]@{
Type = 'UserCreated'
ID = $response.id
}
}

'Team' {
$teamParams = @{
Method = 'POST'
Uri = "https://graph.microsoft.com/v1.0/teams"
Headers = @{ Authorization = "Bearer $($token.AccessToken)" }
Body = @{
"template@odata.bind" = "https://graph.microsoft.com/v1.0/teamsTemplates('standard')"
displayName = $DisplayName
description = "Automatically created team"
} | ConvertTo-Json
}
$response = Invoke-RestMethod @teamParams
$managementReport.Operations += [PSCustomObject]@{
Type = 'TeamProvisioned'
ID = $response.id
}
}
}

# 获取许可证信息
$licenseData = Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/subscribedSkus" \
-Headers @{ Authorization = "Bearer $($token.AccessToken)" }
$managementReport.LicenseDetails = $licenseData.value |
Group-Object skuPartNumber -AsHashTable |
ForEach-Object { @{$_.Key = $_.Value.consumedUnits} }

# 计算成功率
$managementReport.SuccessRate = ($managementReport.Operations.Count / 1) * 100
}
catch {
Write-Error "资源管理失败: $_"
}

# 生成管理报告
$managementReport | Export-Clixml -Path "$env:TEMP/GraphReport_$(Get-Date -Format yyyyMMdd).xml"
return $managementReport
}

核心功能

  1. Azure AD用户自动化创建
  2. Microsoft Teams团队自动部署
  3. 许可证使用情况监控
  4. XML格式管理报告

应用场景

  • 企业用户生命周期管理
  • 团队协作环境快速部署
  • 许可证使用效率分析
  • 合规审计数据准备

PowerShell 技能连载 - 自动化部署Kubernetes集群

在云原生技术普及的今天,Kubernetes已成为容器编排的事实标准。传统部署方式需要手动执行多步操作,本文介绍如何通过PowerShell实现本地开发环境的Kubernetes集群自动化部署,显著提升环境搭建效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 创建Kubernetes部署模块
function New-KubeCluster {
param(
[ValidateSet('minikube','k3s','microk8s')]
[string]$ClusterType = 'minikube',
[int]$WorkerNodes = 2
)

try {
# 环境预检
if (-not (Get-Command docker -ErrorAction SilentlyContinue)) {
throw "Docker引擎未安装"
}

# 根据不同集群类型执行部署
switch ($ClusterType) {
'minikube' {
minikube start --nodes=$WorkerNodes --driver=docker
minikube addons enable ingress
}
'k3s' {
Invoke-WebRequest -Uri https://get.k3s.io | bash -s -- --worker $WorkerNodes
}
'microk8s' {
snap install microk8s --classic
microk8s enable dns dashboard ingress
}
}

# 验证集群状态
$status = kubectl cluster-info
Write-Host "集群部署完成:$status"
}
catch {
Write-Error "部署失败:$_"
}
}

代码实现原理:

  1. 通过环境预检确保Docker已安装,这是所有本地Kubernetes方案的运行基础
  2. 支持三种主流轻量级Kubernetes发行版,通过参数切换部署类型
  3. 使用minikube时自动创建指定数量的Worker节点并启用Ingress控制器
  4. 部署完成后自动验证集群状态,输出连接信息
  5. 异常处理机制捕获部署过程中的常见错误

此脚本大幅简化了开发环境的搭建流程,通过封装复杂的CLI命令为可重复使用的PowerShell函数,特别适合需要频繁重建测试环境的CI/CD场景。

PowerShell 技能连载 - 绿色计算能效优化智能系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function Optimize-EnergyEfficiency {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$DatacenterAPI,

[ValidateSet('Realtime','Predictive')]
[string]$OptimizeMode = 'Predictive'
)

$energyReport = [PSCustomObject]@{
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
PUE = 1.0
CoolingEfficiency = 0
OptimizationActions = @()
}

try {
# 获取实时能效数据
$metrics = Invoke-RestMethod -Uri "$DatacenterAPI/metrics"
$energyReport.PUE = $metrics.PowerUsageEffectiveness

# AI预测优化模式
if ($OptimizeMode -eq 'Predictive') {
$prediction = Invoke-AIModel -ModelPath "$PSScriptRoot/energy_model.zip" -InputData $metrics

$energyReport.OptimizationActions = $prediction.Recommendations | ForEach-Object {
[PSCustomObject]@{
Action = $_
ExpectedSavings = (Get-Random -Minimum 5 -Maximum 15)
}
}
}

# 执行冷却优化
if ($metrics.CoolingEfficiency -lt 0.8) {
Invoke-RestMethod -Uri "$DatacenterAPI/cooling" -Method PUT -Body (@{TargetTemp = 22} | ConvertTo-Json)
$energyReport.CoolingEfficiency = 0.85
}
}
catch {
Write-Error "能效优化失败: $_"
}

# 生成绿色计算报告
$energyReport | Export-Clixml -Path "$env:TEMP/GreenReport_$(Get-Date -Format yyyyMMdd).xml"
return $energyReport
}

核心功能

  1. 实时能效指标监控(PUE)
  2. AI预测性优化建议
  3. 冷却系统智能调节
  4. XML格式能效报告

应用场景

  • 数据中心能耗管理
  • 碳中和目标实施
  • 智能电网需求响应
  • 能源成本优化分析

PowerShell正则表达式核心指南

基础模式匹配

1
2
3
4
5
6
7
8
9
10
# 简单匹配示例
'PSVersion: 5.1' -match '\d+\.\d+'
$matches[0] # 输出5.1

# 多行匹配技巧
$text = @"
Error: 0x80070005
Warning: 0x80040001
"@
$text | Select-String -Pattern '0x[0-9a-f]{8}'

常用操作符对比

方法 作用域 返回类型
-match 标量匹配 布尔
-replace 替换操作 字符串
Select-String 流式处理 MatchInfo

典型应用场景

  1. 日志文件中的错误代码提取
  2. 配置文件参数值替换
  3. 结构化文本数据解析
  4. 输入验证中的格式检查

性能优化建议

1
2
3
4
5
6
# 避免重复编译正则表达式
$regex = [regex]::new('^\d{4}-\d{2}-\d{2}$')
$regex.IsMatch('2024-04-18')

# 正确使用贪婪/惰性量词
'<div>content</div>' -match '<div>(.*?)</div>' # 惰性匹配

PowerShell 技能连载 - 管理 DNS 的 8 个最佳 Powershell 脚本

Active Directory 的另一个主要部分是 DNS。如果您是 Windows 服务器管理员,那么您很清楚它的工作原理,但在没有知道命令实际操作的情况下,使用 Powershell 进行管理和自动化有时会变得困难。

DNS 在组织中扮演着至关重要的角色,因此需要一些窥视来确保其正常运行。在我们领域中,通过 GUI 为服务器或工作站创建 DNS 记录似乎很容易,但当需要同时创建多个 DNS 记录时就会变得困难起来。从创建记录到将其指向正确的 IP 地址都具有挑战性。但我已经接受了这一挑战,并编写了一些相关脚本,并对其进行了优化以便无需任何混乱即可运行。如果您喜欢这部分内容,则肯定也会喜欢 DHCP powershell 脚本以及我的 powershell 脚本库。

好的开始意味着良好的结束,在下面是一些例子。从恢复 DNS 服务器到在 DNS 中创建区域,我都做到了。以下是一些书籍供您参考,如果您打算学习关于 DNS 或 powershell 的知识,请查阅以下最佳可用 DNS Powershell 脚本列表。

对于DNS有用的Powershell命令

添加DNS转发器

1
Add-DnsServerForwarder -IPAddress IP -PassThru

添加根提示服务器

1
Add-DnsServerRootHint -NameServer "domain.com" -IPAddress IP

获取DNS服务器配置

1
Get-DnsServer -ComputerName "IP"

获取DNS服务器转发器设置

1
Get-DnsServerForwarder

从DNS服务器中删除转发器

1
Remove-DnsServerForwarder -IPAddress IP -PassThru

设置DNS服务器配置

1
Get-DnsServer -CimSession IP | Set-DnsServer

清除 DNS 缓存

1
Clear-DnsServerCache -ComputerName "Name of server" -Force

恢复 DNS 区域

在 Powershell 中使用简单命令创建区域更加容易,无需转到 dnsmgmt.msc 创建新的所需区域。

工作原理

脚本将在备份文件夹中搜索备份,并搜索可以恢复的指定区域。

可能结果

如果您提供了所有正确信息,则 DNS 区域应该会通过最新备份恢复。

下载

您可以从以下链接下载脚本:

恢复 DNS 区域

创建主/辅助/存根区域

错误地删除了 DNS 区域?别担心,只要有 dns 区域的备份。这是一个非常方便的脚本来恢复 DNS 区域。

工作原理

只需提供将在所需服务器上创建辅助区域的区 IP 地址即可。

问题结果

主 / 辅助 / 存根区将在所需服务器上创建。

下载

您可以从以下链接下载脚本:

创建DNS转发器

在PowerShell中创建DNS转发器非常快速和简单。只需一行代码就可以摆脱繁琐的点击。

工作原理

提供批量或单个IP地址,并运行脚本,应该会创建DNS转发器,但请确保提供正确的IP地址。

可能的结果

该脚本将创建DNS转发器,应该可以ping通,并且请求应被重定向到转发器。

下载

您可以从以下链接下载脚本。

DNS 转发器

修改DNS记录

在PowerShell中创建DNS转发器非常快速和简单。只需一行代码就可以摆脱繁琐的点击。

工作原理

提供批量或单个IP地址,并运行脚本,应该会创建DNS转发器,但请确保提供正确的IP地址。

可能的结果

该脚本将创建DNS转发器,应该可以ping通,并且请求应被重定向到转发器。

下载

您可以从以下链接下载脚本。

修改主机记录 - 内部

创建多个 DNS 记录

是否曾经面对过搜索要更改 IP 的 DNS 记录挑战?PowerShell已经使这变得如此简便可靠。这个脚本是一个很好的例子。

工作原理

它将把主机名(hostname)的 IP 更改为所需 IP 地址。只需提供正确详细信息并查看其工作方式。

可能结果

如果一切顺利,则主机名 IP 应更换为新提供的 IP 地址。

下载

您可以从以下链接下载此脚本。

create-dns-record

检查多台主机 FQDN

假设有这样一种情况:你被要求在环境中提供多台主机 FQDN ,但你不知道其中有多少是工作组服务器“麻烦”,我专门为这种时刻编写了一个脚本, 以便不必逐个通过 nslookup 进行检查而实际上我们也能够为同样目标编写一个相同功能性质 的 脚步 。FQDN 看起来像 hostname.xyz.com 。

工作原理

它将使用 nslookup 并在短时间内提供多台服务器 FQDN 。

可能结果

如果它存在于您环境中,则会获取到 主机 FQDN ,如果不存在,则需要检查是否是工作组服务器或者列表中是否存在拼写错误。如果遇到任何问题,请随时联系我;如果需要视频演示,请告诉我. 您直接通过 Facebook 或 Gmail 联系我,在页尾都有我的邮箱.

下载

您可从下方链接下载此文件.

nslookup