我想设置一个网络共享,只授予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。
答案 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,您可以确保用户只能看到他们实际可以访问的文件夹和文件(避免混淆尝试访问对象只是为了获得"访问被拒绝"错误)。