基于 AutomatedLab 官方文档整理,面向 Acceptance-Tests.md 中定义的集成测试需求。
可行。 AutomatedLab 原生支持本项目的核心测试依赖:
| 验收需求 | AutomatedLab 支持 |
|---|---|
| SQL Server 2016 / 2019 / 2022 各至少 1 实例 | SQLServer2016、SQLServer2019、SQLServer2022 角色 |
| 域环境(DC + 域成员 SQL Server) | RootDC 角色 + DomainName 参数 |
| 非域独立 Windows 主机 | 不指定 DomainName 的独立 VM |
| UDP 广播 / 子网扫描 | 同一虚拟网络内多 SQL 实例 |
| 弱口令 / 默认 sa 检测 | 部署后通过 Invoke-LabCommand 或手动配置 |
AutomatedLab 通过 PowerShell 脚本声明式部署 Hyper-V(本地)或 Azure(云)实验环境,与 PowerUpSQLSharp 的 Windows/.NET 4.8 运行环境完全兼容。
不适用或需额外工作的场景:
- Sliver C2 托管验收需自行在 Client VM 上安装 Sliver,AutomatedLab 不提供此角色
- 部分攻击链场景(链接服务器爬取、UNC 注入等)可能需额外 PostInstallation 脚本手工配置
- 宿主机必须是 Windows 10/11 Pro/Enterprise 或 Windows Server(需 Hyper-V);家庭版不支持 Hyper-V
推荐实验拓扑(单域 + 多版本 SQL + 独立主机 + 测试客户端):
┌─────────────────────────────────────────┐
│ Hyper-V 宿主机(AutomatedLab 控制端) │
└─────────────────────────────────────────┘
│
虚拟网络 192.168.100.0/24(可自动分配)
│
┌───────────────┬───────────────┼───────────────┬───────────────┐
│ │ │ │ │
DC1 (RootDC) SQL16 SQL19 SQL22 STANDALONE
contoso.com 域成员+SQL2016 域成员+SQL2019 域成员+SQL2022 工作组 SQL
│ │ │ │ │
└───────────────┴───────────────┴───────────────┴───────────────┘
│
CLIENT1
(运行 PowerUpSQLSharp 对照测试)
| 项目 | 最低建议(本实验拓扑) | 说明 |
|---|---|---|
| 操作系统 | Windows 10/11 Pro+ 或 Server 2012 R2+ | 推荐 en-us 语言环境 |
| CPU | 支持 Intel VT-x / AMD-V | BIOS 中启用虚拟化 |
| 内存 | 32 GB+ | DC 2G + 3×SQL 4G + 独立机 4G + 客户端 2G + 宿主机开销 |
| 磁盘 | 150 GB+ 可用空间(SSD) | 官方明确不建议机械硬盘 |
| PowerShell | 5.1+,推荐 PowerShell 7 | 管理员权限 |
| .NET | 4.7.1+(Windows PowerShell) | |
| Hyper-V | 已启用 | Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All |
将 ISO 放入 LabSources\ISOs\(安装 AutomatedLab 后创建,见第 5 节)。
至少需要:
- Windows Server 2019 或 2022 Datacenter(Desktop Experience)— 用于 DC 与 SQL 服务器
- Windows 10/11 Pro — 用于测试客户端(可选,也可在宿主机直接测试)
验证 ISO 可被识别:
# 将路径替换为你的 LabSources 实际位置
Get-LabAvailableOperatingSystem -Path C:\LabSources通过 Add-LabIsoImageDefinition 注册 SQL 安装镜像。Developer / Evaluation 版均可用于测试。
# 文件名按你实际下载的 ISO 修改
Add-LabIsoImageDefinition -Name SQLServer2016 -Path C:\LabSources\ISOs\SQLServer2016.iso
Add-LabIsoImageDefinition -Name SQLServer2019 -Path C:\LabSources\ISOs\SQLServer2019.iso
Add-LabIsoImageDefinition -Name SQLServer2022 -Path C:\LabSources\ISOs\SQLServer2022.isoSQL Server 2017 及以上若需 Reporting Services 且宿主机离线,需额外放置
LabSources\SoftwarePackages\SQLServerReportingServices.exe(见官方 SQL 角色文档)。
官方提供两种方式,任选其一。
以管理员身份打开 PowerShell:
Install-PackageProvider Nuget -Force
Install-Module AutomatedLab -SkipPublisherCheck
# 非交互环境:跳过遥测对话框(可选)
[Environment]::SetEnvironmentVariable('AUTOMATEDLAB_TELEMETRY_OPTIN', 'false', 'Machine')
$env:AUTOMATEDLAB_TELEMETRY_OPTIN = 'false'
# 配置宿主机远程(部署必需)
Enable-LabHostRemoting -Force
# 创建 LabSources 目录结构
New-LabSourcesFolder -DriveLetter C参考:Installation - From gallery
- 从 GitHub Releases 下载最新 MSI
- 运行安装程序;建议选择自定义安装,将
LabSources放到空间充足的磁盘(模块默认在C:\Program Files\WindowsPowerShell\Modules) - 确认
LabSources目录结构完整(含ISOs、SoftwarePackages、Tools等子文件夹)
Get-Module AutomatedLab -ListAvailable
Test-LabHostConnected将以下脚本保存为 Deploy-PowerUpSQLSharpLab.ps1,根据实际 ISO 路径与版本调整后,以管理员身份在 PowerShell ISE 或 pwsh 中执行。
<#
.SYNOPSIS
使用 AutomatedLab 部署 PowerUpSQLSharp 集成测试实验环境
.DESCRIPTION
拓扑:1 DC + 3 域成员 SQL(2016/2019/2022)+ 1 工作组 SQL + 1 客户端
参考:AutomatedLab 官方示例 06 SQL Server and client, domain joined.ps1
#>
[CmdletBinding()]
param(
[string]$LabName = 'PowerUpSQLSharpLab',
[string]$DomainName = 'contoso.com',
[string]$InstallUser = 'Install',
[string]$InstallPassword = '[密码已脱敏]'
)
$ErrorActionPreference = 'Stop'
# LabSources 路径(Gallery 安装默认 C:\LabSources)
$labSources = if ($labsources) { $labsources } else { 'C:\LabSources' }
Import-Module AutomatedLab
# ── 1. 实验定义 ──────────────────────────────────────────────
New-LabDefinition -Name $LabName -DefaultVirtualizationEngine HyperV
# 手动指定网段(可选;省略则由 AL 自动选择 192.168.x.0/24)
Add-LabVirtualNetworkDefinition -Name $LabName -AddressSpace 192.168.100.0/24
# ── 2. 注册 SQL ISO(按实际文件名修改 Path)──────────────────
Add-LabIsoImageDefinition -Name SQLServer2016 -Path "$labSources\ISOs\SQLServer2016.iso"
Add-LabIsoImageDefinition -Name SQLServer2019 -Path "$labSources\ISOs\SQLServer2019.iso"
Add-LabIsoImageDefinition -Name SQLServer2022 -Path "$labSources\ISOs\SQLServer2022.iso"
# 域与统一安装凭据
Add-LabDomainDefinition -Name $DomainName -AdminUser $InstallUser -AdminPassword $InstallPassword
Set-LabInstallationCredential -Username $InstallUser -Password $InstallPassword
# 域内机器默认参数
$PSDefaultParameterValues = @{
'Add-LabMachineDefinition:Network' = $LabName
'Add-LabMachineDefinition:DomainName' = $DomainName
'Add-LabMachineDefinition:OperatingSystem' = 'Windows Server 2019 Datacenter (Desktop Experience)'
'Add-LabMachineDefinition:Memory' = 4GB
}
# ── 3. 虚拟机定义 ────────────────────────────────────────────
# 域控制器
Add-LabMachineDefinition -Name DC1 -Roles RootDC -Memory 2GB -OperatingSystem 'Windows Server 2019 Datacenter (Desktop Experience)'
# 域成员 SQL Server(仅引擎 + 工具,可按需加 Sample DB)
$sqlRole2016 = Get-LabMachineRoleDefinition -Role SQLServer2016 -Properties @{ Features = 'SQL,Tools' }
$sqlRole2019 = Get-LabMachineRoleDefinition -Role SQLServer2019 -Properties @{ Features = 'SQL,Tools' }
$sqlRole2022 = Get-LabMachineRoleDefinition -Role SQLServer2022 -Properties @{ Features = 'SQL,Tools' }
Add-LabMachineDefinition -Name SQL16 -Roles $sqlRole2016 -Processors 2
Add-LabMachineDefinition -Name SQL19 -Roles $sqlRole2019 -Processors 2
Add-LabMachineDefinition -Name SQL22 -Roles $sqlRole2022 -Processors 2
# 工作组独立 SQL(测试非域 graceful degradation)
$standaloneRole = Get-LabMachineRoleDefinition -Role SQLServer2019 -Properties @{ Features = 'SQL,Tools' }
Add-LabMachineDefinition -Name STANDALONE -Roles $standaloneRole -DomainName $null -Processors 2
# 域成员测试客户端
Add-LabMachineDefinition -Name CLIENT1 -OperatingSystem 'Windows 10 Pro' -Memory 2GB -Processors 2
# ── 4. 部署 ──────────────────────────────────────────────────
Install-Lab
Show-LabDeploymentSummary -Detailed角色说明:
SQLServer20xx角色会自动创建服务账户;默认实例名为MSSQLSERVER。更多属性见 SQL Server 角色文档。
AutomatedLab 默认 sa 密码由内部生成。部署完成后,通过官方 Invoke-LabCommand 在 VM 内执行配置:
Import-Lab -Name PowerUpSQLSharpLab
# 示例:为验收用例 B1-060 配置弱口令 sa(仅测试环境)
$script = {
Invoke-Sqlcmd -Query "ALTER LOGIN sa WITH PASSWORD = ''" -ErrorAction SilentlyContinue
Invoke-Sqlcmd -Query "ALTER LOGIN sa ENABLE" -ErrorAction SilentlyContinue
}
Invoke-LabCommand -ComputerName SQL16 -ScriptBlock $script
# 示例:启用 xp_cmdshell(B1-070 对照项,按需)
$enableXp = {
Invoke-Sqlcmd -Query "EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;"
}
Invoke-LabCommand -ComputerName SQL19 -ScriptBlock $enableXp将 PowerUpSQLSharp.exe 复制到客户端:
Copy-LabFileItem -Path 'C:\Tools\PowerUpSQLSharp\dist\PowerUpSQLSharp.exe' -ComputerName CLIENT1 -DestinationFolderPath 'C:\Tools'参考:Invoke-LabCommand、Exchanging data
在 CLIENT1 或宿主机上(需能解析 contoso.com DNS,域成员或配置 hosts 后):
# 本机实例发现(在 SQL VM 上执行)
.\PowerUpSQLSharp.exe Get-SQLInstanceLocal
# 域内实例发现(B1-020)
.\PowerUpSQLSharp.exe Get-SQLInstanceDomain
# UDP 子网扫描(B1-040)
.\PowerUpSQLSharp.exe Get-SQLInstanceScanUDP -ComputerName 192.168.100.0 -SubnetMask 255.255.255.0
# 连接测试(B1-050,实例名按 Show-LabDeploymentSummary 输出调整)
.\PowerUpSQLSharp.exe Get-SQLConnectionTest -Instance "SQL19" -Username sa -Password "<sa密码>"
# 服务器信息(B1-070)
.\PowerUpSQLSharp.exe Get-SQLServerInfo -Instance "SQL19" -Username sa -Password "<sa密码>"获取各 VM 的 IP 与默认凭据:
Get-LabVM | Select-Object Name, IpAddress, DomainName, Roles
Get-LabCredential| 操作 | 命令 |
|---|---|
| 查看已部署实验 | Get-Lab -List |
| 导入已关闭 ISE 后的实验 | Import-Lab -Name PowerUpSQLSharpLab |
| 创建快照 | Checkpoint-LabVM -All |
| 恢复快照 | Restore-LabVMSnapshot -All |
| 远程 PowerShell 会话 | Enter-LabPSSession -ComputerName SQL19 |
| 完全删除实验 | Remove-Lab |
删除实验会移除 VM、虚拟交换机和差分磁盘,但保留基础镜像以加速下次部署。
参考:Getting started - Removing a Lab
| 现象 | 处理 |
|---|---|
| 找不到操作系统 ISO | 确认 ISO 在 LabSources\ISOs\,运行 Get-LabAvailableOperatingSystem |
| SQL 角色部署失败 | 检查 Add-LabIsoImageDefinition 的 Name 与 Role 版本一致 |
| 磁盘速度慢 / 超时 | 将 VmPath 指向 SSD:New-LabDefinition -VmPath D:\AutomatedLab-VMs |
| 内存不足 | 减少并行 VM 或降低 -Memory;可拆成两个实验分批部署 |
| Pester 验证提示 | 可选安装 Pester 5.0.1+;不影响部署,仅影响部署后验证 |
| 宿主机无法访问域 DNS | 在宿主机 hosts 添加 DC IP,或使用 Enter-LabPSSession 在 CLIENT1 内测试 |
若内存 < 32 GB,可分批或缩减:
方案 A — 最小域环境(约 12 GB): DC + SQL19 + CLIENT1
方案 B — 仅非域(约 6 GB): 单台 STANDALONE + SQL2019,覆盖 B1-002、B1-050 等无 AD 用例
方案 C — Azure 云实验: 在 Linux/macOS 或低配笔记本上,通过 Azure 订阅部署(需按官方 Azure 文档配置,并将 ISO 同步到云存储)。
| 验收类别 | 本实验覆盖 |
|---|---|
| B1-001 ~ B1-003 本机实例发现 | SQL16/19/22、STANDALONE 各 VM |
| B1-010 ~ B1-011 UDP 广播/扫描 | 同子网多 SQL 实例 |
| B1-020 ~ B1-021 域/非域 | SQL19(域)+ STANDALONE(工作组) |
| B1-050 ~ B1-052 连接测试 | 各 SQL VM |
| B1-060 ~ B1-061 弱口令 | 部署后脚本配置 |
| B1-070 服务器信息 | 各版本 SQL |
| Batch 4 AD 函数 | DC1 + contoso.com 域 |
完整 108 项函数验收可能仍需手工配置链接服务器、CLR 程序集等复杂场景,可在本实验基础上通过 Invoke-LabCommand 追加 PostInstallation 脚本扩展。