powershell可导出导入共享权限(非ntfs权限),使用get-smbshare与get-smbshareaccess导出为csv,含sharename、accountname、accesscontroltype、accessright四列;导入需先验证共享及账户有效性,推荐先清理旧权限再重建,注意域账号格式与sid一致性。
powershell 可以高效完成 windows 共享权限(share permissions)的导出与导入,但需注意:它操作的是共享层权限(即“共享权限”,如 read/change/full control),而非 ntfs 文件系统权限(即“安全权限”)。两者独立存在、互不影响。实际使用中建议先明确目标——仅导出共享权限,还是连同 ntfs 权限一并处理(后者需额外命令)。
导出共享权限到 CSV 文件
使用 Get-SmbShare 获取共享列表,再通过 Get-SmbShareAccess 获取每个共享的权限条目,最终导出为结构化 CSV。关键点在于按共享名称分组、保留账户名、访问级别和拒绝状态:
- 运行 Get-SmbShare | Where-Object {$_.Name -notmatch "^\$"} | ForEach-Object { $share = $_; Get-SmbShareAccess -Name $share.Name | Select-Object @{n='ShareName';e={$share.Name}}, AccountName, AccessControlType, AccessRight } | Export-Csv -Path "SharePermissions_Export.csv" -NoTypeInformation -Encoding UTF8
- 注意:过滤掉以 $ 结尾的隐藏共享(如 ADMIN$, IPC$),避免误导;AccessControlType 区分 Allow/Deny;AccessRight 对应 Read/Change/Full
- 导出文件包含四列:ShareName、AccountName、AccessControlType、AccessRight,可直接用于审核或后续导入
从 CSV 导入共享权限(逐个应用)
导入不是一键还原,而是遍历 CSV 行,对每个共享调用 Grant-SmbShareAccess 或 Revoke-SmbShareAccess。必须确保共享已存在,且账户(用户/组)在本地或域中有效:
- 先执行 $perms = Import-Csv "SharePermissions_Export.csv" 加载数据
- 再用 $perms | ForEach-Object { if ($_.AccessControlType -eq 'Allow') { Grant-SmbShareAccess -Name $_.ShareName -AccountName $_.AccountName -AccessRight $_.AccessRight -Force } else { Revoke-SmbShareAccess -Name $_.ShareName -AccountName $_.AccountName -Force } }
- 警告:若目标服务器不存在对应共享,命令会报错;若账户名拼写错误或已删除,也会失败——建议导入前用 Get-SmbShare 核对共享名,用 Get-LocalGroupMember 或 Get-ADUser 验证账户有效性
批量清理旧权限再导入(推荐做法)
直接追加权限可能导致冗余或冲突。稳妥方式是先清除现有共享权限(保留 Everyone 的默认 Read 除外),再按 CSV 重建:
- 清空某共享所有自定义权限:Get-SmbShareAccess -Name "ShareName" | Where-Object {$_.AccountName -notin @("Everyone")} | ForEach-Object { Revoke-SmbShareAccess -Name "ShareName" -AccountName $_.AccountName -Force }
- 再执行前述导入逻辑,确保权限状态干净、可预测
- 如需保留 Everyone 的基础读取权限,可在清理后手动加回:Grant-SmbShareAccess -Name "ShareName" -AccountName "Everyone" -AccessRight Read -Force
注意事项与常见问题
PowerShell 管理共享权限依赖 SMB 模块(Windows Server / Windows 10+ 自带),且需管理员权限运行。以下情况需特别留意:
- 跨服务器迁移时,账户 SID 不同,即使用户名相同也可能权限失效——域环境建议用域账号(如 DOMAIN\User),非域环境尽量统一本地账户名与 SID
- CSV 中的 AccountName 若含域前缀(如 CONTOSO\John),导入时必须确保该域可达;若用 UPN 格式(john@contoso.com),部分旧版本 PowerShell 可能不识别
- 导出脚本未包含“权限继承”或“特殊访问控制”等高级设置,仅覆盖标准三档权限(Read/Change/Full),复杂策略需结合 Get-Acl + Set-Acl 处理 NTFS 层











