PowerShell可通过Get-SmbShare(本地)或net view/WMI/CIM(远程)探测共享,脚本基于白名单比对识别未授权共享,需管理员权限及WinRM支持,并建议正则过滤、结果导出与告警联动。
确认目标服务器的共享状态
powershell 本身不直接扫描远程共享,但可通过 get-smbshare(需在目标服务器本地执行)或 net view / wmi/cim 查询(从管理端远程探测)获取共享信息。自动识别“未授权”共享,关键在于定义“授权清单”——比如只允许 public、software$ 等命名规范,或排除含 $ 的隐藏共享以外的非常规名称(如 hr_data、backup2024)。
编写基础扫描脚本(远程探测 + 名称过滤)
以下脚本从管理员工作站运行,对一组服务器批量检查共享名称是否偏离白名单:
<# 检查未授权共享:仅列出非系统默认、非预设白名单的共享 #>
$servers = @("SRV-DB01", "SRV-APP02", "192.168.10.55")
$allowedShares = @("C$", "D$", "ADMIN$", "IPC$", "PRINT$", "Public", "Deploy")
foreach ($server in $servers) {
if (Test-Connection -ComputerName $server -Count 1 -Quiet) {
try {
$shares = Get-SmbShare -ComputerName $server -ErrorAction Stop |
Where-Object { $_.Name -notin $allowedShares -and $_.ScopeName -eq "SMB2" }
if ($shares) {
Write-Host "`n⚠️ $server 存在未授权共享:" -ForegroundColor Red
$shares | Select-Object Name, Path, Description | Format-Table -AutoSize
} else {
Write-Host "✅ $server 共享合规" -ForegroundColor Green
}
} catch {
Write-Warning "$server 访问失败:$($_.Exception.Message)"
}
} else {
Write-Warning "$server 不在线"
}
}
增强安全性与实用性建议
-
权限前提:运行脚本的账户需在目标服务器上具备 Administrators 或至少 SMB Share Admin 权限;启用 WinRM(
Enable-PSRemoting)可提升Get-SmbShare -ComputerName可靠性 -
避免误报:用正则匹配替代全名比对,例如过滤掉以
Temp、Old、Test开头的共享:Where-Object { $_.Name -notmatch '^(C|D|ADMIN|IPC|PRINT)$|Public|Deploy$' -and $_.Name -notmatch '^Temp|Old|Test' } -
输出留存:添加
| Export-Csv -Path "UnauthorizedShares_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation -Append自动归档结果 -
联动告警:发现异常时调用
Send-MailMessage或写入 Windows 事件日志(Write-EventLog),便于 SIEM 接入
补充说明:为什么不能仅靠“匿名访问”判断?
Windows 共享是否“未授权”,核心不在是否允许 Guest 访问,而在于业务逻辑是否需要该共享存在。例如一个开放给全员的 \srvMarketing 可能是合法的;而一个未记录、无文档、权限宽松的 \srvUsers 则高度可疑。脚本重点应放在 共享命名合规性 + 存在合理性 + 访问控制审计(后续可扩展 Get-SmbShareAccess),而非单纯检测“能否连上”。

















