用 PowerShell 管共享
SmbShare 模块把共享的创建、授权、审计与删除全部命令化:New-SmbShare 建共享、Grant-SmbShareAccess 授权、Get-SmbShareAccess 查权限、Remove-SmbShare 删除。相比图形界面,它最大的优势是可批量、可留档——一条命令导出全机共享清单与各自的访问权限,直接生成 CSV 归档,权限审计从半天缩短到几分钟。
基本信息
| 适用平台 | Windows 8/10/11 与 Windows Server 2012 及以后(SmbShare 模块) |
|---|---|
| 创建/删除 | New-SmbShare、Remove-SmbShare、Set-SmbShare |
| 授权/回收 | Grant-SmbShareAccess、Revoke-SmbShareAccess、Block-SmbShareAccess |
| 审计 | Get-SmbShare、Get-SmbShareAccess、Get-SmbSession、Get-SmbOpenFile |
| 权限档位 | Full、Change、Read、Custom(以 SDDL 精细指定) |
| 权限要求 | 创建与授权需要管理员;域账户用 域\账户 写法,本机账户用 主机名\账户 写法 |
典型使用场景
- 标准化建共享:按命名与权限规范一次性创建,避免人工点选差异
- 权限审计:导出全机共享与授权清单,核对是否符合最小权限要求
- 批量调整:统一为某个运维组追加 Change 权限,逐台机器下发
- 临时共享回收:项目结束后按名字精确删除,同时释放会话
- 占用排查:查看谁在占用共享文件,必要时关闭句柄以便备份或删除
常用示例
常用示例
Get-SmbShare | Select-Object Name, Path, Description, EncryptData # 列出全部共享
New-SmbShare -Name Data -Path D:\Data -FullAccess 'DOMAIN\OPS' # 建共享并授权运维组
Grant-SmbShareAccess -Name Data -AccountName 'DOMAIN\Staff' -AccessRight Change -Force # 追加授权
Grant-SmbShareAccess -Name Data -AccountName 'Everyone' -AccessRight Read -Force # 只读档位
Get-SmbShareAccess -Name Data | Select-Object AccountName, AccessControlType, AccessRight # 查看共享权限
Revoke-SmbShareAccess -Name Data -AccountName 'DOMAIN\Staff' -Force # 回收授权
Set-SmbShare -Name Data -EncryptData $true -Force # 开启 SMB 加密
Remove-SmbShare -Name Data -Force # 删除共享(不删文件,会断开在线会话)命令与用途对照
| 命令 | 用途 | 注意 |
|---|---|---|
| New-SmbShare | 创建共享并一次性授予权限 | 权限组合尽量显式,别依赖默认值 |
| Grant-SmbShareAccess | 追加授权 | 同一账户重复授权会报冲突,需 -Force |
| Get-SmbShareAccess | 查看共享级权限 | 不含 NTFS 权限,两者取交集生效 |
| Get-SmbSession | 查看当前连接会话 | 用于确认谁在线、从哪台机器登录 |
| Get-SmbOpenFile | 查看被打开的文件句柄 | 配合 Close-SmbOpenFile 才能释放占用 |
| Remove-SmbShare | 删除共享 | 在线会话立即断开,业务可能中断 |
共享权限与 NTFS 权限取交集:两级里更严格的那个生效。只配一半就授权,典型表现是「明明给了完全控制还是拒绝访问」,排查时两级都要看。
名字以 $ 结尾的共享(如 Data$)不会出现在资源管理器浏览列表中,但仍可通过 \\主机\Data$ 访问;这是隐藏共享的常见做法,不是安全边界。
审计与占用处理
审计与占用处理
Get-SmbShare | ForEach-Object { Get-SmbShareAccess -Name $_.Name } |
Export-Csv D:\audit\smb_access.csv -Encoding UTF8 -NoTypeInformation # 权限清单归档
Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens # 在线会话
Get-SmbOpenFile | Select-Object ClientUserName, Path, Permissions # 被占用的文件
Get-SmbOpenFile | Where-Object Path -like 'D:\Data\*' | Close-SmbOpenFile -Force # 释放占用以便备份
Get-SmbShare -Name Data | Get-SmbShareAccess # 单共享复核Remove-SmbShare 会立刻断开该共享上的所有在线会话,正在读写大文件或数据库文件的用户会出现中断甚至损坏风险。删除前先确认会话情况与业务窗口,必要时提前通知。