# ============================================================
# Windows 10 家庭版 打印机共享诊断脚本(集中显示结果)
# 纯检查模式,不做任何修改 | 无函数版,兼容性更好
# ============================================================
# 初始化结果数组(使用 ArrayList 确保全局有效)
$结果列表 = New-Object System.Collections.ArrayList
Write-Host "`n正在扫描系统配置,请稍候..." -ForegroundColor Gray
# ========== 辅助:添加结果 ==========
# 直接用 $结果列表.Add() 添加,不用函数避免作用域问题
# ---------- 1. 检查 Guest 账户 ----------
try {
$guest账户 = Get-LocalUser -Name "Guest" -ErrorAction Stop
if ($guest账户.Enabled) {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "Guest账户状态"; 状态 = "符合"; 详情 = "已启用" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "Guest账户状态"; 状态 = "不符合"; 详情 = "当前为禁用状态" })
}
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "Guest账户状态"; 状态 = "检查失败"; 详情 = "无法获取账户信息" })
}
# ---------- 2. 检查 ForceGuest ----------
try {
$注册表值 = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "ForceGuest" -ErrorAction Stop).ForceGuest
if ($注册表值 -eq 0) {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "网络访问模型(ForceGuest)"; 状态 = "符合"; 详情 = "经典模式 (值为0)" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "网络访问模型(ForceGuest)"; 状态 = "不符合"; 详情 = "来宾模式 (值为1,应改为0)" })
}
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "网络访问模型(ForceGuest)"; 状态 = "检查失败"; 详情 = "注册表项不存在" })
}
# ---------- 3. 检查 restrictanonymous ----------
try {
$注册表值 = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "restrictanonymous" -ErrorAction Stop).restrictanonymous
if ($注册表值 -eq 0) {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "匿名访问限制(restrictanonymous)"; 状态 = "符合"; 详情 = "允许匿名访问 (值为0)" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "匿名访问限制(restrictanonymous)"; 状态 = "不符合"; 详情 = "限制匿名访问 (值为1,应改为0)" })
}
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "匿名访问限制(restrictanonymous)"; 状态 = "检查失败"; 详情 = "注册表项不存在" })
}
# ---------- 4. 检查 LimitBlankPasswordUse ----------
try {
$注册表值 = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "LimitBlankPasswordUse" -ErrorAction Stop).LimitBlankPasswordUse
if ($注册表值 -eq 0) {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "空密码登录限制(LimitBlankPasswordUse)"; 状态 = "符合"; 详情 = "允许空密码登录 (值为0)" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "空密码登录限制(LimitBlankPasswordUse)"; 状态 = "不符合"; 详情 = "禁止空密码登录 (值为1,应改为0)" })
}
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "空密码登录限制(LimitBlankPasswordUse)"; 状态 = "检查失败"; 详情 = "注册表项不存在" })
}
# ---------- 5. 检查 everyoneincludesanonymous ----------
try {
$注册表值 = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "everyoneincludesanonymous" -ErrorAction Stop).everyoneincludesanonymous
if ($注册表值 -eq 1) {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "Everyone包含匿名(everyoneincludesanonymous)"; 状态 = "符合"; 详情 = "已包含 (值为1)" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "Everyone包含匿名(everyoneincludesanonymous)"; 状态 = "不符合"; 详情 = "未包含 (值为0,应改为1)" })
}
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "Everyone包含匿名(everyoneincludesanonymous)"; 状态 = "检查失败"; 详情 = "注册表项不存在" })
}
# ---------- 6. 检查安全策略:拒绝从网络访问 ----------
try {
$临时文件 = "$env:TEMP\secpol_$([DateTime]::Now.Ticks).cfg"
secedit /export /cfg "$临时文件" | Out-Null
$策略内容 = Get-Content "$临时文件" -ErrorAction Stop
$拒绝行 = $策略内容 | Select-String "SeDenyNetworkLogonRight" | Select-Object -First 1
if ($拒绝行) {
$拒绝值 = ($拒绝行 -split "=")[1].Trim()
if ($拒绝值 -match "Guest|Everyone") {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "安全策略: 拒绝从网络访问"; 状态 = "不符合"; 详情 = "列表中包含 Guest 或 Everyone" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "安全策略: 拒绝从网络访问"; 状态 = "符合"; 详情 = "未阻塞 Guest/Everyone" })
}
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "安全策略: 拒绝从网络访问"; 状态 = "符合"; 详情 = "列表为空(无限制)" })
}
Remove-Item "$临时文件" -Force -ErrorAction SilentlyContinue
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "安全策略: 拒绝从网络访问"; 状态 = "检查失败"; 详情 = "无法导出安全策略" })
}
# ---------- 7. 检查安全策略:允许从网络访问 ----------
try {
$临时文件 = "$env:TEMP\secpol_$([DateTime]::Now.Ticks).cfg"
secedit /export /cfg "$临时文件" | Out-Null
$策略内容 = Get-Content "$临时文件" -ErrorAction Stop
$允许行 = $策略内容 | Select-String "SeNetworkLogonRight" | Select-Object -First 1
if ($允许行) {
$允许值 = ($允许行 -split "=")[1].Trim()
if ($允许值 -match "Guest") {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "安全策略: 允许从网络访问"; 状态 = "符合"; 详情 = "列表中包含 Guest" })
} elseif ($允许值 -match "Everyone") {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "安全策略: 允许从网络访问"; 状态 = "符合"; 详情 = "列表中包含 Everyone(Guest可通过Everyone访问)" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "安全策略: 允许从网络访问"; 状态 = "不符合"; 详情 = "列表中未包含 Guest 或 Everyone" })
}
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "安全策略: 允许从网络访问"; 状态 = "不符合"; 详情 = "列表为空(未授权任何用户)" })
}
Remove-Item "$临时文件" -Force -ErrorAction SilentlyContinue
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "安全策略: 允许从网络访问"; 状态 = "检查失败"; 详情 = "无法导出安全策略" })
}
# ---------- 8. 检查防火墙 ----------
try {
$防火墙规则 = Get-NetFirewallRule -DisplayGroup "文件和打印机共享" -Enabled True -ErrorAction Stop
if ($防火墙规则) {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "防火墙: 文件和打印机共享"; 状态 = "符合"; 详情 = "已启用" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "防火墙: 文件和打印机共享"; 状态 = "不符合"; 详情 = "未启用或规则被禁用" })
}
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "防火墙: 文件和打印机共享"; 状态 = "检查失败"; 详情 = "无法查询防火墙规则" })
}
# ---------- 9. 检查 445 端口 ----------
try {
$端口规则 = Get-NetFirewallRule -Direction Inbound | Where-Object { ($_.DisplayName -like "*445*" -or $_.DisplayName -like "*SMB*") -and $_.Enabled -eq $true }
if ($端口规则) {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "防火墙: 445端口(SMB)入站"; 状态 = "符合"; 详情 = "已放行" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "防火墙: 445端口(SMB)入站"; 状态 = "不符合"; 详情 = "未找到放行规则" })
}
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "防火墙: 445端口(SMB)入站"; 状态 = "检查失败"; 详情 = "无法查询防火墙规则" })
}
# ---------- 10. 检查共享打印机 ----------
try {
$打印机列表 = Get-CimInstance -ClassName Win32_Printer -ErrorAction Stop | Where-Object { $_.Shared -eq $true }
if ($打印机列表) {
$打印机名称 = ($打印机列表 | ForEach-Object { "$($_.Name) (共享名: $($_.ShareName))" }) -join "; "
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "共享打印机"; 状态 = "符合"; 详情 = "发现 $($打印机列表.Count) 台: $打印机名称" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "共享打印机"; 状态 = "不符合"; 详情 = "未发现任何共享打印机" })
}
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "共享打印机"; 状态 = "检查失败"; 详情 = "无法查询打印机信息" })
}
# ---------- 11. 检查工作组/域环境 ----------
try {
$系统信息 = Get-CimInstance -ClassName Win32_ComputerSystem -ErrorAction Stop
$域名称 = $系统信息.Domain
if ($域名称 -eq $系统信息.Name) {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "网络环境"; 状态 = "符合"; 详情 = "工作组模式 (计算机名: $($系统信息.Name))" })
} else {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "网络环境"; 状态 = "符合"; 详情 = "域环境: $域名称 (通常不影响Guest共享)" })
}
} catch {
$null = $结果列表.Add([PSCustomObject]@{ 检查项目 = "网络环境"; 状态 = "检查失败"; 详情 = "无法获取计算机信息" })
}
# ============================================================
# 集中显示结果
# ============================================================
Clear-Host
Write-Host "=" * 60 -ForegroundColor Cyan
Write-Host " Windows 10 家庭版 打印机共享诊断报告" -ForegroundColor Cyan
Write-Host "=" * 60 -ForegroundColor Cyan
Write-Host "诊断时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Gray
Write-Host "计算机名: $(hostname)" -ForegroundColor Gray
Write-Host "-" * 60 -ForegroundColor Gray
# 统计
$总项数 = $结果列表.Count
$符合数 = ($结果列表 | Where-Object { $_.状态 -eq "符合" }).Count
$不符合数 = ($结果列表 | Where-Object { $_.状态 -eq "不符合" }).Count
$检查失败数 = ($结果列表 | Where-Object { $_.状态 -eq "检查失败" }).Count
Write-Host "`n【检查结果汇总】" -ForegroundColor Yellow
Write-Host " 总计检查: $总项数 项" -ForegroundColor White
Write-Host " ✅ 符合: $符合数 项" -ForegroundColor Green
Write-Host " ❌ 不符合: $不符合数 项" -ForegroundColor Red
Write-Host " ⚠️ 检查失败: $检查失败数 项" -ForegroundColor Yellow
Write-Host "-" * 60 -ForegroundColor Gray
# 详细列表
Write-Host "`n【详细清单】" -ForegroundColor Yellow
$符合项 = $结果列表 | Where-Object { $_.状态 -eq "符合" }
if ($符合项) {
Write-Host "`n✅ 符合 ($($符合项.Count) 项):" -ForegroundColor Green
foreach ($单项 in $符合项) {
Write-Host " $($单项.检查项目)" -ForegroundColor White -NoNewline
if ($单项.详情) { Write-Host " → $($单项.详情)" -ForegroundColor Gray } else { Write-Host "" }
}
}
$不符合项 = $结果列表 | Where-Object { $_.状态 -eq "不符合" }
if ($不符合项) {
Write-Host "`n❌ 不符合 ($($不符合项.Count) 项) - 需要修复:" -ForegroundColor Red
foreach ($单项 in $不符合项) {
Write-Host " $($单项.检查项目)" -ForegroundColor White -NoNewline
if ($单项.详情) { Write-Host " → $($单项.详情)" -ForegroundColor Yellow } else { Write-Host "" }
}
}
$检查失败项 = $结果列表 | Where-Object { $_.状态 -eq "检查失败" }
if ($检查失败项) {
Write-Host "`n⚠️ 检查失败 ($($检查失败项.Count) 项) - 需要人工核查:" -ForegroundColor Yellow
foreach ($单项 in $检查失败项) {
Write-Host " $($单项.检查项目)" -ForegroundColor White -NoNewline
if ($单项.详情) { Write-Host " → $($单项.详情)" -ForegroundColor Yellow } else { Write-Host "" }
}
}
Write-Host "`n" + "=" * 60 -ForegroundColor Cyan
Write-Host "提示: 请根据上方 ❌ 不符合 的项目手动修复,修复后需重启电脑生效。" -ForegroundColor White
Write-Host "=" * 60 -ForegroundColor Cyan
Read-Host "`n按回车键退出"
| Guest 账户已禁用 | 计算机管理 → 本地用户和组 → 用户 → Guest → 取消“账户已禁用” |
| ForceGuest = 1 | 按 Win+R,输入 regedit,定位到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa,将 ForceGuest 改为 0 |
| LimitBlankPasswordUse = 1 | 同上位置,将 LimitBlankPasswordUse 改为 0 |
单独创建一个用户
New-LocalUser -Name "printer_user" -Password (ConvertTo-SecureString "Print666" -AsPlainText -Force) -FullName "打印机共享" -Description "打印机共享"
Add-LocalGroupMember -Group "Guests" -Member "printer_user"
- 控制面板 → 设备和打印机
- 右键要共享的打印机 → 打印机属性 → 安全 选项卡
- 点击 添加 → 输入
printer_user→ 确定 - 在权限列表中,给
printer_user勾上 打印 的 允许(其他如管理打印机、更改属性不要勾)
本网站素材来自于网络或者投稿,如有侵权,请联系本站管理员处理!
