1. 权限体系概述
Windows 文件服务器有双重权限体系:共享权限和NTFS 权限,两者共同决定用户最终访问权限。
在共享文件夹右键 → "属性" → "共享"选项卡 → 点击"共享"按钮,查看共享权限设置界面
在"安全"选项卡中查看NTFS 权限,点击"高级"可查看详细的权限继承和传播设置
使用有效权限标签页:高级安全设置中点击"选择用户" → 输入用户名 → 查看该用户对文件夹的有效权限
# 查看共享权限(SMB 级别)
Get-SmbShareAccess -Name "Public"
# 查看 NTFS 权限
Get-Acl "E:\Shares\Public" | Select-Object PSPath, Access
2. 共享权限配置
右键共享文件夹 Public → "属性" → "共享" → 点击"共享..."按钮
在"文件共享"对话框中,点击下拉箭头查看或添加其他用户
点击"共享"按钮完成设置。如果需要更详细的权限配置,点击"共享" → 选择"高级共享"
在"高级共享"中,点击"权限"按钮 → 添加/移除用户组并设置权限级别(完全控制/更改/读取)
# 授予 Domain Admins 完全控制
Grant-SmbShareAccess -Name "Public" -AccountName "IEHANG\Domain Admins" -AccessRight "Full"
# 限制匿名访问
Set-SmbServerConfiguration -RequireSecuritySignature $false -EnableSecuritySignature $true
3. NTFS 权限配置
右键文件夹 → "属性" → "安全"选项卡 → 点击"编辑..."按钮
点击"添加..." → 在对象名称中输入 IEHANG\财务部 → 点击"检查名称"确认 → 确定
在权限列表中,勾选允许的权限(如"修改"权限)→ 点击"确定"
点击"高级" → 在"权限"选项卡中查看详细的权限继承情况
对于继承权限,取消勾选"包括可从该对象的父级继承的权限"可断开继承
# 设置 NTFS 权限(授予修改权限)
$acl = Get-Acl "E:\Shares\Public"
$permission = "IEHANG\Domain Users", "Modify", "ContainerInherit,ObjectInherit", "None", "Allow"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($permission)
$acl.SetAccessRule($rule)
Set-Acl "E:\Shares\Public" $acl
# 使用 icacls 快速设置
icacls "E:\Shares\Public" /grant "IEHANG\Domain Users:(OI)(CI)R"
4. 权限继承与传播
右键文件夹 → "属性" → "安全" → "高级" → 查看"权限"选项卡
查看"包括可从该对象的父级继承的权限"复选框状态
点击"禁用继承"按钮 → 选择"将此对象的所有可继承权限转换为此对象的显式权限"
在"应用于"下拉列表中选择权限传播范围:"此文件夹、子文件夹和文件"(最常用)
# 禁用继承,保留现有显式权限
$acl = Get-Acl "E:\Shares\Private"
$acl.SetAccessRuleProtection($true, $true)
Set-Acl "E:\Shares\Private" $acl
# 查看所有 NTFS 权限
Get-Acl "E:\Shares\Public".Access |
Format-Table IdentityReference, FileSystemRights, IsInherited
5. 各部门共享文件夹实战
本节通过实际案例演示如何为企业各部门创建共享文件夹并配置权限。假设企业有以下部门:财务部、人事部、IT信息部、市场部。
域环境:iehang.cn
文件服务器:FS01.iehang.cn
共享根目录:E:\Shares
已创建部门安全组:财务部-G、人事部-G、IT信息部-G、市场部-G
5.1 创建文件夹结构
在文件服务器上打开"文件资源管理器",导航到 E:\Shares
创建以下文件夹结构:
E:\Shares\部门共享- 各部门专属文件夹E:\Shares\部门共享\财务部E:\Shares\部门共享\人事部E:\Shares\部门共享\IT信息部E:\Shares\部门共享\市场部E:\Shares\公共文档- 全员可读的公共资料E:\Shares\软件分发- IT部门管理的软件安装包
确保每个部门文件夹名称与AD中的部门名称一致,便于后续权限分配
# 定义部门列表
$departments = @("财务部", "人事部", "IT信息部", "市场部")
# 创建部门共享文件夹
foreach ($dept in $departments) {
$path = "E:\Shares\部门共享\$dept"
if (!(Test-Path $path)) {
New-Item -Path $path -ItemType "Directory"
Write-Host "已创建: $path"
}
}
# 创建公共文件夹
New-Item -Path "E:\Shares\公共文档" -ItemType "Directory" -Force
New-Item -Path "E:\Shares\软件分发" -ItemType "Directory" -Force
5.2 配置NTFS权限
权限设计原则:最小权限原则,用户只拥有完成工作所需的最小权限。
右键 E:\Shares\部门共享\财务部 → "属性" → "安全" → "高级"
点击"禁用继承" → 选择"将此对象的所有可继承权限转换为此对象的显式权限"
移除不需要的权限条目(如 Users、Authenticated Users),只保留 SYSTEM 和 Administrators
点击"添加" → "选择主体" → 输入 IEHANG\财务部-G → 勾选"修改"权限 → 确定
重复步骤4,为部门经理组添加"完全控制"权限(如 IEHANG\财务部经理-G)
# 为财务部配置权限
$path = "E:\Shares\部门共享\财务部"
# 禁用继承并转换为显式权限
$acl = Get-Acl $path
$acl.SetAccessRuleProtection($true, $true)
Set-Acl $path $acl
# 重新获取ACL并移除不需要的权限
$acl = Get-Acl $path
$acl.Access | Where-Object {
$_.IdentityReference -notmatch "SYSTEM|Administrators"
} | ForEach-Object {
$acl.RemoveAccessRule($_) | Out-Null
}
# 添加财务部组 - 修改权限
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"IEHANG\财务部-G",
"Modify",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($rule)
# 添加Domain Admins - 完全控制
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"IEHANG\Domain Admins",
"FullControl",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($rule)
Set-Acl $path $acl
Write-Host "财务部权限配置完成" -ForegroundColor Green
5.3 创建共享并配置共享权限
右键 E:\Shares\部门共享 → "属性" → "共享" → "高级共享"
勾选"共享此文件夹" → 共享名输入 部门共享$(末尾加$表示隐藏共享)
点击"权限" → 移除"Everyone" → 添加"Domain Users"并授予"读取"权限
点击"确定"完成共享创建。用户访问时使用 \\FS01\部门共享$
# 创建部门共享(隐藏共享)
New-SmbShare -Name "部门共享$" -Path "E:\Shares\部门共享" -Description "各部门专属文件夹"
# 配置共享权限
Grant-SmbShareAccess -Name "部门共享$" -AccountName "IEHANG\Domain Users" -AccessRight "Read"
Grant-SmbShareAccess -Name "部门共享$" -AccountName "IEHANG\Domain Admins" -AccessRight "Full"
# 创建公共文档共享
New-SmbShare -Name "公共文档" -Path "E:\Shares\公共文档" -Description "全员可读公共资料"
Grant-SmbShareAccess -Name "公共文档" -AccountName "IEHANG\Domain Users" -AccessRight "Read"
共享权限:设置为"Everyone 读取"或"Domain Users 读取",保持简单
NTFS权限:精细控制各部门的访问权限,实际权限由两者交集决定
原则:共享权限宽松,NTFS权限严格
6. 基于访问的枚举(ABE)
基于访问的枚举(Access-Based Enumeration,ABE)是一项重要安全功能,启用后用户只能看到自己有权限访问的文件夹,无权限的文件夹将被隐藏。
在部门共享文件夹中启用ABE后,财务部员工登录时只能看到"财务部"文件夹,无法看到"人事部"、"IT信息部"等其他部门文件夹,既提升用户体验,又增强安全性。
6.1 启用ABE功能
打开服务器管理器 → "文件和存储服务" → "共享"
右键共享 部门共享$ → "属性" → "设置"选项卡
勾选"启用基于访问的枚举" → 确定
对其他需要启用ABE的共享重复以上操作
# 查看当前ABE状态
Get-SmbShare -Name "部门共享$" | Select-Object Name, FolderEnumerationMode
# 启用ABE(AccessBased = 仅显示有权限的文件夹)
Set-SmbShare -Name "部门共享$" -FolderEnumerationMode "AccessBased"
# 批量启用所有共享的ABE
Get-SmbShare | Where-Object { $_.Name -ne "IPC$" -and $_.Name -ne "ADMIN$" } | ForEach-Object {
Set-SmbShare -Name $_.Name -FolderEnumerationMode "AccessBased"
Write-Host "已为 $($_.Name) 启用ABE"
}
6.2 ABE验证效果
# 步骤1:使用财务部用户登录客户端
# 用户:iehang\caiwu01
# 密码:P@ssw0rd
# 步骤2:访问共享路径
# Win+R → 输入 \\FS01\部门共享$
# 步骤3:观察结果
# ✓ 只能看到"财务部"文件夹
# ✗ 看不到"人事部"、"IT信息部"、"市场部"文件夹
# 步骤4:尝试直接访问其他部门文件夹
# Win+R → 输入 \\FS01\部门共享$\人事部
# 结果:提示"您没有权限访问此文件夹"
7. 客户端验证
完成权限配置后,需要从客户端验证各用户组的访问权限是否符合预期。
7.1 准备测试账户
# 创建测试用户
$users = @(
@{Name="caiwu01"; Dept="财务部"},
@{Name="renshi01"; Dept="人事部"},
@{Name="it01"; Dept="IT信息部"},
@{Name="shichang01"; Dept="市场部"}
)
foreach ($u in $users) {
New-ADUser -Name $u.Name -SamAccountName $u.Name -Enabled $true -AccountPassword (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force)
Add-ADGroupMember -Identity "$($u.Dept)-G" -Members $u.Name
Write-Host "已创建用户: $($u.Name) 并加入 $($u.Dept)-G"
}
7.2 验证矩阵
| 测试用户 | 所属部门 | 可访问文件夹 | 权限级别 |
|---|---|---|---|
| caiwu01 | 财务部 | 财务部、公共文档 | 修改、读取 |
| renshi01 | 人事部 | 人事部、公共文档 | 修改、读取 |
| it01 | IT信息部 | IT信息部、软件分发、公共文档 | 修改、完全控制、读取 |
| shichang01 | 市场部 | 市场部、公共文档 | 修改、读取 |
7.3 客户端测试步骤
登录测试账户:使用 iehang\caiwu01 登录域成员计算机
访问共享:按 Win+R → 输入 \\FS01\部门共享$ → 回车
验证ABE:确认只能看到"财务部"文件夹,看不到其他部门文件夹
测试写入:在"财务部"文件夹中创建测试文件 test.txt,确认可以正常创建
测试跨部门访问:尝试访问 \\FS01\部门共享$\人事部,应提示"拒绝访问"
测试公共文档:访问 \\FS01\公共文档,确认可以读取但无法修改
7.4 使用PowerShell验证权限
# 查看用户对文件夹的有效权限
$path = "E:\Shares\部门共享\财务部"
$user = "IEHANG\caiwu01"
# 方法1:使用icacls查看权限
icacls $path
# 方法2:使用Get-Acl查看详细权限
$acl = Get-Acl $path
$acl.Access | Where-Object { $_.IdentityReference -like "*财务部*" } |
Format-Table IdentityReference, FileSystemRights, AccessControlType
# 方法3:测试用户是否可以访问(需以该用户身份运行)
Test-Path "\\FS01\部门共享$\财务部"
7.5 映射网络驱动器
为方便用户日常使用,可以通过组策略或登录脚本自动映射网络驱动器。
@echo off
:: 映射部门共享为Z盘
net use Z: /delete /y 2>nul
net use Z: "\\FS01\部门共享$" /persistent:yes
:: 映射公共文档为Y盘
net use Y: /delete /y 2>nul
net use Y: "\\FS01\公共文档" /persistent:yes
echo 网络驱动器映射完成!
8. 常见问题
拒绝权限优先于允许权限。建议尽量使用"允许"而非"拒绝"。如果必须使用拒绝,应在最底层的NTFS权限中设置,而非共享权限。
使用 icacls 命令导出导入权限,或通过 PowerShell 脚本批量配置。注意修改权限后需要让用户重新登录才能生效。
检查:1) 用户是否在某个有权限的安全组中;2) 是否有显式拒绝权限;3) 客户端是否缓存了旧的文件夹列表,尝试清除缓存或重启客户端。
排查步骤:1) 确认用户已加入对应的安全组;2) 检查NTFS权限是否正确配置;3) 检查共享权限是否允许访问;4) 使用"有效权限"工具验证用户权限。
创建部门经理安全组(如"财务部经理-G"),在NTFS权限中添加该组并授予"完全控制"权限。部门经理即可管理文件夹内的所有文件,包括其他员工创建的文件。