PowerShell使用及故障排除全解析
1. Azure VM操作要点
1.1 创建变量
在操作开始时,需创建变量来保存重要值。在生产或测试环境中,部分值可能需要更改,像存储账户或Azure Web应用名称这类必须全局唯一的名称,需测试其唯一性。若计划在生产环境部署Azure VM,应制定公司命名规则,平衡易用性和唯一性。例如,32字符的VM存储账户名很可能唯一,但在控制台输入较困难。
1.2 创建新的Azure VM
创建新的Azure VM时,此过程可能需数分钟完成,因为Azure要在计算服务器上创建VM、配置磁盘映像并完成Windows Server安装。性能可能取决于Azure位置及其当前工作负载。创建VM时若未指定
-Size
参数,Azure默认使用
Standard_D2s_V3
大小。更多VM大小信息可参考:https://docs.microsoft.com/azure/virtual-machines/sizes 。
1.3 远程连接VM
使用Windows远程桌面客户端应用程序创建到新Azure VM的终端会话。需注意,开放RDP端口从Internet入站虽功能方便,但存在安全风险。若需RDP访问,应通过VPN访问RDP会话。
1.4 清理资源
最后需移除Azure VM、VM的网络组件、VM磁盘,以及整个操作过程中使用的存储账户和资源组。
2. PowerShell脚本故障排除
2.1 故障类型
PowerShell脚本故障主要分为以下三类:
| 故障类型 | 描述 | 示例 | 解决建议 |
| — | — | — | — |
| 语法错误 | 因打字不精确导致的常见错误,脚本在解决此类错误前无法成功运行 | 输入
Get-ChildTiem
而非
Get-ChildItem
| 使用VS Code等优秀代码编辑器,利用其语法高亮功能;使用PowerShell控制台或VS Code编辑器的Tab补全功能 |
| 逻辑错误 | 代码未按预期执行,原因多样 | 定义变量但未使用或变量名输入错误 | 使用PowerShell Script Analyzer分析代码,找出潜在问题 |
| 运行时错误 | 脚本在运行过程中遇到的问题 | AD服务崩溃、网络接口控制器故障、网络路径问题 | 检查网络连接,确保网络路径正常;确保网络配置正确 |
2.2 使用PowerShell Script Analyzer
PowerShell Script Analyzer是PowerShell团队开发的模块,可分析代码并提供改进机会,可从PowerShell Gallery下载最新版本。若使用VS Code编辑器,该工具已内置其中,能实时高亮显示分析出的错误。此外,它还能重新格式化PowerShell代码,使其更易读,可通过配置多种设置来指定格式化规则。
操作步骤如下:
1.
发现PowerShell Script Analyzer模块
Find-Module -Name PSScriptAnalyzer |
Format-List Name, Type, Desc*, Author, Company*, *Date, *URI*
- 安装Script Analyzer模块
Install-Module -Name PSScriptAnalyzer -Force
- 发现Script Analyzer模块中的命令
Get-Command -Module PSScriptAnalyzer
- 发现分析器规则
Get-ScriptAnalyzerRule |
Group-Object -Property Severity |
Sort-Object -Property Count -Descending
- 检查一条规则
Get-ScriptAnalyzerRule |
Select-Object -First 1 |
Format-List
- 创建有问题的脚本文件
@'
# Bad.ps1
# A file to demonstrate Script Analyzer
#
### Uses an alias
$Procs = gps
### Uses positional parameters
$Services = Get-Service 'foo' 21
### Uses poor function header
Function foo {"Foo"}
### Function redefines a built in command
Function Get-ChildItem {"Sorry Dave I cannot do that"}
### Command uses a hard coded computer name
Test-Connection -ComputerName DC1
### A line that has trailing white space
$foobar ="foobar"
### A line using a global variable
$Global:foo
'@ | Out-File -FilePath "C:\Foo\Bad.ps1"
- 检查新创建的脚本文件
Get-ChildItem C:\Foo\Bad.ps1
- 分析脚本文件
Invoke-ScriptAnalyzer -Path C:\Foo\Bad.ps1 |
Sort-Object -Property Line
- 定义一个函数以便更好地格式化
$Script1 = @'
function foo {"hello!"
Get-ChildItem -Path C:\FOO
}
'@
- 定义格式化设置
$Settings = @{
IncludeRules = @("PSPlaceOpenBrace", "PSUseConsistentIndentation")
Rules = @{
PSPlaceOpenBrace = @{
Enable = $true
OnSameLine = $true
}
PSUseConsistentIndentation = @{
Enable = $true
}
}
}
- 调用格式化程序
Invoke-Formatter -ScriptDefinition $Script1 -Settings $Settings
- 更改设置并重新格式化
$Settings.Rules.PSPlaceOpenBrace.OnSameLine = $False
Invoke-Formatter -ScriptDefinition $Script1 -Settings $Settings
3. 使用Best Practices Analyzer
3.1 原理及作用
避免故障排除的一种方法是更无故障或至少容错地部署服务。Windows Server Best Practices Analyzer(BPA)是内置的Windows Server工具,可分析本地服务器是否遵循最佳实践。最佳实践是行业专家认可的服务器配置最佳方式,但在某些情况下可能不适合特定需求,因此审查BPA结果时需运用判断力。
3.2 操作步骤
此操作需使用SRV1(Reskit.Org域中加入域的Windows 2022服务器),且Reskit.Org域中的域控制器(DC1和DC2)需在线。
1.
创建到DC1上Windows PowerShell的远程会话
$BPAS = New-PSSession -ComputerName DC1
- 发现DC1上的BPA模块
$SB1 = {
Get-Module -Name BestPractices -List |
Format-Table -AutoSize
}
Invoke-Command -Session $BPAS -ScriptBlock $SB1
需注意,BPA在任何受支持的Windows Server版本的PowerShell 7中无法原生工作,可通过PowerShell远程处理在Windows PowerShell中运行。
3.
发现BPA模块中的命令
$SB2 = {
Get-Command -Module BestPractices |
Format-Table -AutoSize
}
Invoke-Command -Session $BPAS -ScriptBlock $SB2
- 发现DC1上所有可用的BPA模型
$SB3 = {
Get-BPAModel |
Format-Table -Property Name,Id, LastScanTime -AutoSize
}
Invoke-Command -Session $BPAS -ScriptBlock $SB3
- 在DC1上运行BPA DS模型
$SB4 = {
Invoke-BpaModel -ModelID Microsoft/Windows/DirectoryServices -Mode ALL |
Format-Table -AutoSize
}
Invoke-Command -Session $BPAS -ScriptBlock $SB4
- 从DC1获取BPA结果
$SB5 = {
Get-BpaResult -ModelID Microsoft/Windows/DirectoryServices |
Where-Object Resolution -ne $null|
Format-List -Property Problem, Resolution
}
Invoke-Command -Session $BPAS -ScriptBlock $SB5
3.3 BPA结果分析
BPA结果包含成功和失败测试的详细信息,失败结果(即部署未实施最佳实践)通常需重点审查并采取行动。运行BPA扫描后,结果可能显示以下三个基本问题:
- 未将持有PDC模拟器FSMO角色的DC上的时间与可靠外部源同步,可能导致主机时间与实际时间偏差,可参考:https://blogs.msmvps.com/acefekay/tag/pdc-emulator-time-configuration/ 配置可靠时间源。
- 未备份AD环境,即使有多台DC,定期备份仍是最佳实践,可参考:https://docs.microsoft.com/windows/win32/ad/backing-up-and-restoring-an-active-directory-server 了解备份和恢复DC的信息。
- DC1是在VM中运行的DC,虽微软支持此类部署,但需遵循一些最佳实践以确保AD服务可靠运行,可参考:https://docs.microsoft.com/windows-server/identity/ad-ds/get-started/virtual-dc/virtualized-domain-controllers-hyper-v 了解使用Hyper - V虚拟化DC的详细信息。
对于测试环境,这些问题大多无关紧要,可忽略。若使用Hyper - V进行测试VM,可配置Hyper - V更新VM的本地时间。
4. 网络故障排除
4.1 基本思路
在某些网络故障排除场景中,使用
Get-NetView
命令可收集大量网络相关信息,但对于一些常见问题,简单步骤可能更有效。此操作在运行Windows Server 2022的本地SRV1(加入域的主机)上进行,通常认为网络问题可能由DNS引起,因此先获取主机的完全限定域名(FQDN)和DNS服务器的IPv4地址,检查DNS服务器是否在线,再确定域中DC的名称并确保可通过特定端口访问,测试默认网关可用性以及远程主机的访问能力。
4.2 操作步骤
- 获取此主机的DNS名称
$DNSDomain = $Env:USERDNSDOMAIN
$FQDN = "$Env:COMPUTERNAME.$DNSDomain"
- 获取DNS服务器地址
$DNSHT = @{
InterfaceAlias = "Ethernet"
AddressFamily = 'IPv4'
}
$DNSServers = (Get-DnsClientServerAddress @DNSHT).ServerAddresses
$DNSServers
- 检查DNS服务器是否在线
Foreach ($DNSServer in $DNSServers) {
$TestDNS = Test-NetConnection -Port 53 -ComputerName $DNSServer
$Result = $TestDNS ? "Available" : ' Not reachable'
"DNS Server [$DNSServer] is $Result"
}
- 定义在我们的域中搜索DC的条件
$DNSRRName = "_ldap._tcp." + $DNSDomain
$DNSRRName
- 获取DC SRV记录
$DCRRS = Resolve-DnsName -Name $DNSRRName -Type all |
Where-Object IP4address -ne $null
$DCRRS
以下是网络故障排除的mermaid流程图:
graph LR
A[开始] --> B[获取主机DNS名称和FQDN]
B --> C[获取DNS服务器地址]
C --> D[检查DNS服务器是否在线]
D --> E[定义搜索DC条件]
E --> F[获取DC SRV记录]
F --> G[结束]
通过以上步骤和方法,可有效进行Azure VM操作、PowerShell脚本故障排除、使用BPA分析以及网络故障排查,提高系统的稳定性和可靠性。
5. 使用Get-NetView检查网络连接
5.1 用途概述
Get-NetView
命令可用于收集大量网络相关信息,有助于诊断和解决复杂的网络问题。与前面提到的基础网络故障排除步骤不同,它能提供更深入、详细的网络洞察,适用于一些难以通过简单测试解决的问题。
5.2 操作流程
虽然文档未详细给出使用
Get-NetView
的具体代码示例,但可以推测其基本操作流程如下:
1.
准备工作
:确保在运行Windows Server 2022的目标主机(如SRV1)上已安装PowerShell 7和VS Code,以方便执行和调试命令。
2.
执行命令
:在PowerShell控制台中输入
Get-NetView
命令,根据实际需求可能需要添加不同的参数来获取特定的网络信息。例如,若要获取特定网络接口的详细信息,可能需要指定接口名称或其他相关参数。
3.
分析结果
:根据命令输出的结果进行分析,查找可能存在的网络问题。结果可能包含网络接口状态、IP地址分配、路由表信息、连接状态等。
以下是使用
Get-NetView
检查网络连接的mermaid流程图:
graph LR
A[准备工作] --> B[执行Get-NetView命令]
B --> C[获取网络信息]
C --> D[分析结果]
D --> E{是否发现问题}
E -- 是 --> F[采取解决措施]
E -- 否 --> G[结束]
F --> G
5.3 结果分析示例
假设
Get-NetView
命令输出显示某个网络接口的状态为“断开连接”,这可能意味着物理连接存在问题,如网线松动、网络设备故障等。此时,可以检查网线连接是否正常,尝试重新插拔网线,或者检查网络设备(如交换机、路由器)的状态。
若输出显示路由表中存在错误的路由信息,可能会导致网络数据包无法正确转发。这种情况下,需要检查路由配置,确保路由表中的信息准确无误。可以使用
Route
命令来查看和修改路由表。
6. PowerShell脚本调试探索
6.1 调试的重要性
调试是从PowerShell脚本中去除错误的艺术和科学。在脚本开发和生产使用过程中,脚本可能无法按预期执行,通过调试可以找出问题所在并解决。
6.2 调试方法
PowerShell提供了丰富的调试功能,以下是一些常见的调试方法:
-
设置断点
:在脚本中设置断点,当脚本执行到断点处时会暂停,此时可以查看变量的值、执行状态等信息。可以使用
Set-PSBreakpoint
命令来设置断点。
-
单步执行
:逐行执行脚本,观察每一步的执行结果,有助于发现逻辑错误。在PowerShell ISE或VS Code中,可以使用调试工具栏上的单步执行按钮来实现。
-
查看变量值
:在调试过程中,查看变量的值可以帮助理解脚本的执行流程和数据处理情况。可以使用
Write-Host
命令或调试工具的变量查看功能来查看变量的值。
6.3 调试示例
以下是一个简单的PowerShell脚本示例,演示如何使用调试功能:
# 定义一个函数,计算两个数的和
function Add-Numbers {
param (
[int]$num1,
[int]$num2
)
$sum = $num1 + $num2
return $sum
}
# 调用函数
$result = Add-Numbers -num1 5 -num2 3
Write-Host "结果: $result"
在VS Code中调试该脚本的步骤如下:
1. 打开脚本文件。
2. 在
$sum = $num1 + $num2
这一行左侧点击,设置断点。
3. 按下F5键启动调试。
4. 脚本执行到断点处会暂停,此时可以将鼠标悬停在
$num1
、
$num2
和
$sum
变量上查看它们的值。
5. 使用调试工具栏上的单步执行按钮逐行执行脚本,观察执行过程。
7. 总结
7.1 关键要点回顾
本文涵盖了多个重要的PowerShell相关主题,包括Azure VM操作、PowerShell脚本故障排除、使用Best Practices Analyzer、网络故障排除、使用
Get-NetView
检查网络连接以及PowerShell脚本调试探索。以下是各主题的关键要点总结:
| 主题 | 关键要点 |
| — | — |
| Azure VM操作 | 创建变量时注意名称唯一性,创建VM需时间且默认大小为
Standard_D2s_V3
,远程连接注意安全,操作结束后清理资源 |
| PowerShell脚本故障排除 | 故障分为语法错误、逻辑错误和运行时错误,可使用VS Code和PowerShell Script Analyzer等工具解决 |
| 使用Best Practices Analyzer | 分析本地服务器是否遵循最佳实践,结果需根据实际情况判断,可发现如时间同步、AD备份等问题 |
| 网络故障排除 | 从获取主机DNS信息开始,检查DNS服务器、DC可达性、默认网关和远程主机访问能力 |
| 使用Get-NetView检查网络连接 | 收集详细网络信息,用于解决复杂网络问题,需分析结果并采取相应措施 |
| PowerShell脚本调试探索 | 通过设置断点、单步执行和查看变量值等方法找出脚本中的错误 |
7.2 实践建议
为了更好地掌握和应用这些知识,建议进行以下实践:
-
多做实验
:在测试环境中按照文中的步骤进行实际操作,加深对每个主题的理解。
-
结合实际场景
:将这些技术应用到实际的工作场景中,解决遇到的问题,提高实践能力。
-
持续学习
:PowerShell和相关技术不断发展,关注官方文档和社区论坛,学习新的功能和技巧。
通过不断实践和学习,能够更加熟练地运用PowerShell进行系统管理和故障排除,提升工作效率和系统的稳定性。
超级会员免费看
35

被折叠的 条评论
为什么被折叠?



