使用 PowerShell 设置子目录的网络共享权限

Setting network share permissions on subdirectory with PowerShell

我想设置一个网络共享,授予对根目录的只读权限,但对其中的子目录授予 READ/WRITE 权限。

我可以手动执行此操作,但我希望能够使用 PowerShell 执行此操作。

\myserver\MyShare           (READ access here for user TESTUSER)
\myserver\MyShare\subfolder (READ/WRITE access here for user TESTUSER)

Windows 资源管理器中的手动步骤 - 打开文件夹属性对话框、"Sharing" 选项卡、"Share..." 按钮,然后我可以添加我的用户并设置权限。我可以对网络共享的根目录和 "subfolder".

执行此操作

我在 PowerShell 中管理的最接近的东西如下,它只设置根:

New-SmbShare –Name MyShare –Path e:\MyShare -ReadAccess "Domain\TESTUSER"

但是,这似乎与出现在文件夹属性对话框中的 "Advanced sharing" 选项等效,这些选项仅在设置新网络共享时适用,不适用于现有网络共享内的文件夹。当我 运行 这个脚本时,TESTUSER 没有添加到简单 "Share..." 对话框中的用户列表中,所以必须有另一种设置权限的方法。

我的问题:如何使用 PowerShell 设置权限,就像 Windows 从文件夹属性上的 "Share..." 按钮一样?

我正在使用 Windows Server 2012 R2。

共享权限适用于整个共享,这意味着它们会影响共享文件夹及其包含的所有内容。如果不将该子文件夹发布为不同的共享,就不可能对该子文件夹应用不同的共享权限,即使这样,修改后的权限也只会在通过新共享访问子文件夹时生效,而不是在将其作为原始共享的子文件夹访问时生效.

对于细粒度的访问控制,您必须使用文件系统 ACL。但是,如果通过共享权限将共享定义为只读,则即使文件系统 ACL 允许,用户也将被拒绝写访问。

由于这些限制,通常的做法是将共享权限设置为对每个人都完全控制,并在文件系统级别进行整个权限处理。设置文件 ACL 最简单的方法仍然是 icacls 命令:

icacls C:\path\to\shared_folder /grant "DOMAIN\testuser:(CI)(OI)RX"
icacls C:\path\to\shared_folder\subfolder /grant "DOMAIN\testuser:(CI)(OI)M"

您也可以使用 Set-Acl 达到同样的目的,但它需要更多代码:

function New-Ace($user, $permission) {
    New-Object Security.AccessControl.FileSystemAccessRule $user, $permission, 'ContainerInherit, ObjectInherit', 'None', 'Allow'
}

$acl = Get-Acl -LiteralPath 'C:\path\to\shared_folder'
$acl.AddAccessRule((New-Ace 'DOMAIN\testuser' 'ReadOrExecute')
Set-Acl -AclObject $acl -LiteralPath 'C:\path\to\shared_folder'

$acl = Get-Acl -LiteralPath 'C:\path\to\shared_folder\subfolder'
$acl.AddAccessRule((New-Ace 'DOMAIN\testuser' 'Modify'))
Set-Acl -AclObject $acl -LiteralPath 'C:\path\to\shared_folder\subfolder'

通过启用 access-based enumeration,您可以确保用户只会看到他们实际有权访问的那些文件夹和文件(避免因尝试访问对象只是为了获得 "access denied" 错误而造成的混淆)。