设置ACL文件夹权限 - 拒绝系统

时间:2018-04-09 09:17:27

标签: powershell acl

我已经在之前的脚本中使用了一些工作代码,这些代码使用POSH改变了文件夹的安全权限,但是,我现在想让DENY,SYSTEM访问此文件夹,而不是允许修改帐户的权限。 ({这是关闭可怕的Windows10UpgraderApp.exe}在MDT任务序列期间运行)。

这是我认为可行的代码:

New-Item -ItemType directory -Path C:\Windows10upgrade -force

$privuser = "system"
$Acl1 = Get-Acl "C:\Windows10Upgrade"
$Ar1 = New-Object system.security.accesscontrol.filesystemaccessrule("$privuser","deny")
$Acl1.SetAccessRule($Ar1)

这是我得到的错误:

New-Object : Cannot find an overload for "FileSystemAccessRule" and the argument count: "2".
At line:3 char:8
+ $Ar1 = New-Object system.security.accesscontrol.filesystemaccessrule("$privuser" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

在这个上丢失了一点 - 这段代码在之前使用过的脚本中有效。

提前致谢

编辑:收到以下建议后(谢谢)我现在运行此代码:

New-Item -type directory -path C:\Windows10Upgrade -force
$Acl = Get-Acl "C:\Windows10Upgrade"
$Ar = New-Object  system.security.accesscontrol.filesystemaccessrule("System","FullControl","Deny")
$Acl.SetAccessRule($Ar)
Set-Acl "C:\Windows10Upgrade" $Acl

我知道它可能具有欺骗性,因为当您以这种方式进行更改时会勾选“特殊权限”框,但是,这不会引发错误,但系统的权限看起来相同,就像遗憾的是没有成功应用更改访问规则。

第二次编辑:似乎发生了一些事情,但现在SYSTEM有多个权限条目,所需的ACL规则位于SYSTEM的顶部,但仍然在下面分配完全控制:

PS C:\WINDOWS\system32> get-acl -Path C:\Windows10upgrade | select *


PSPath                  : Microsoft.PowerShell.Core\FileSystem::C:\Windows10upgrade
PSParentPath            : Microsoft.PowerShell.Core\FileSystem::C:\
PSChildName             : Windows10upgrade
PSDrive                 : C
PSProvider              : Microsoft.PowerShell.Core\FileSystem
CentralAccessPolicyId   : 
CentralAccessPolicyName : 
AccessToString          : NT AUTHORITY\SYSTEM Deny  FullControl
                          BUILTIN\Administrators Allow  FullControl
                          BUILTIN\Administrators Allow  268435456
                          NT AUTHORITY\SYSTEM Allow  FullControl
                          NT AUTHORITY\SYSTEM Allow  268435456
                          BUILTIN\Users Allow  ReadAndExecute, Synchronize
                          NT AUTHORITY\Authenticated Users Allow  Modify, Synchronize
                          NT AUTHORITY\Authenticated Users Allow  -536805376
AuditToString           : 
Path                    : Microsoft.PowerShell.Core\FileSystem::C:\Windows10upgrade
Owner                   : BUILTIN\Administrators
Group                   : COMPANY\Roles - Technical Services
Access                  : {System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule, 
                          System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule...}
Sddl                    : O:BAG:S-1-5-21-2593231249-3506496172-1181922232-40387D:AI(D;;FA;;;SY)(A;ID;FA;;;BA)(A;OICIIOID;GA;;;BA)(A;ID;FA;;;SY)(A;OI
                          CIIOID;GA;;;SY)(A;OICIID;0x1200a9;;;BU)(A;ID;0x1301bf;;;AU)(A;OICIIOID;SDGXGWGR;;;AU)
AccessRightType         : System.Security.AccessControl.FileSystemRights
AccessRuleType          : System.Security.AccessControl.FileSystemAccessRule
AuditRuleType           : System.Security.AccessControl.FileSystemAuditRule
AreAccessRulesProtected : False
AreAuditRulesProtected  : False
AreAccessRulesCanonical : True
AreAuditRulesCanonical  : True

1 个答案:

答案 0 :(得分:2)

解决方案在错误消息中。引用the documentation,至少需要3个参数。那是this constructor

public FileSystemAccessRule(
    string identity,
    FileSystemRights fileSystemRights,
    AccessControlType type
)

您似乎错过了中间参数FileSystemRights,因为您已将用户指定为" system"并且AccessControlType要拒绝......但不能拒绝哪些权限。

修改

右键单击该文件夹,然后转到Properties> Security> Advanced。您应该看到类似于下面的屏幕。

Security settings after running script for System and Admin

蓝色突出显示的行是脚本添加的行。黄色突出显示的行是继承的,因此它未在文件夹上设置,而是在整个驱动器上设置。对我来说,这就是为什么有多个权限行。

Deny胜过Allow,这不是一个真正的问题。要确认,您可以为您的用户或管理员组设置Deny权限,并尝试访问该文件夹。

如果权限未被继承,而是应用于该文件夹,则需要使用RemoveAccessRule方法,其方式与SetAccessRule的使用方式类似:

$remove = New-Object  system.security.accesscontrol.filesystemaccessrule("System","FullControl","Allow")
$Acl.RemoveAccessRule($remove)