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

时间:2018-06-13 11:30:00

标签: powershell permissions windows-server-2012 network-share

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

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

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

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

我在PowerShell中最接近的是以下内容,它只设置了根目录:

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

但是,这似乎相当于文件夹属性对话框中显示的“高级共享”选项,这些选项仅在设置新网络共享时适用,而不适用于现有网络共享中的文件夹。当我运行此脚本时,TESTUSER不会添加到简单“共享...”对话框中的用户列表中,因此必须有另一种设置权限的方式。

我的问题:如何使用PowerShell以与Windows文件夹属性中“共享...”按钮相同的方式设置权限?

我正在使用Windows Server 2012 R2。

1 个答案:

答案 0 :(得分:1)

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

对于细粒度的访问控制,您必须使用文件系统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,您可以确保用户只能看到他们实际可以访问的文件夹和文件(避免混淆尝试访问对象只是为了获得"访问被拒绝"错误)。