请求协助编写PowerShell脚本枚举域内开放文件共享及共享权限
企业文件共享及权限枚举PowerShell脚本优化
原脚本存在的问题
foreach ($ComputerName in '$ComputersNames')使用单引号导致变量被当作字符串,无法遍历计算机列表,需改为遍历对象的Name属性。- 依赖
net view解析共享信息,输出格式不稳定易出错,推荐用PowerShell原生远程命令获取结构化数据。
整合权限获取的完整脚本
# 获取域内所有计算机名称(直接提取字符串数组) $ComputersNames = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name # 创建列表存储最终结果(包含计算机名、共享名、路径、权限) $ShareResults = [System.Collections.Generic.List[PSObject]]::new() foreach ($ComputerName in $ComputersNames) { try { # 快速测试计算机是否在线 if (Test-Connection -BufferSize 32 -Count 1 -ComputerName $ComputerName -Quiet -ErrorAction Stop) { # 远程调用获取共享及权限信息 $Shares = Invoke-Command -ComputerName $ComputerName -ScriptBlock { # 筛选文件系统类型的共享(排除打印、IPC等非文件共享) Get-SmbShare | Where-Object { $_.ShareType -eq 'FileSystemDirectory' } | ForEach-Object { # 获取共享路径的访问控制列表(ACL) $acl = Get-Acl -Path $_.Path # 整理权限条目为结构化对象 $permissions = $acl.Access | ForEach-Object { [PSCustomObject]@{ 身份标识 = $_.IdentityReference.Value 权限类型 = $_.FileSystemRights.ToString() 访问控制 = $_.AccessControlType.ToString() } } # 返回单条共享的完整信息 [PSCustomObject]@{ 共享名称 = $_.Name 共享路径 = $_.Path 权限列表 = $permissions } } } -ErrorAction Stop # 将远程结果与计算机名整合,添加到结果列表 foreach ($Share in $Shares) { $ShareResults.Add([PSCustomObject]@{ 计算机名 = $ComputerName 共享名称 = $Share.共享名称 共享路径 = $Share.共享路径 权限列表 = $Share.权限列表 }) } } } catch { Write-Warning "处理计算机 $ComputerName 失败: $_" } } # 控制台输出结果(可替换为导出CSV用于审计) $ShareResults | Format-Table -AutoSize # $ShareResults | Export-Csv -Path "C:\企业共享权限枚举.csv" -NoTypeInformation -Encoding UTF8
关键说明
- 权限要求:运行脚本的账号必须具备域内目标计算机的管理员权限,才能执行远程调用和读取ACL信息。
- WinRM配置:目标计算机需开启WinRM服务,可通过
Enable-PSRemoting -Force提前配置(需管理员权限执行)。 - 结果处理:脚本最终输出包含完整权限信息的结构化对象,可直接查看或导出为CSV文件用于后续审计分析。
内容的提问来源于stack exchange,提问作者Biswa
相关产品推荐
相关产品推荐

