PowerShell GetAccessControl返回不一致的结果

时间:2017-04-13 19:03:55

标签: powershell acl

我知道标题可能有点误导,但如果不输入10行文字就不可能写得更好,所以我在这里:

我正在尝试列出我的硬盘驱动器的权限,我发现以下方法效果很好:

$drives = get-wmiobject win32_volume | ? { ($_.DriveType -eq 3) -and ($_.DriveLetter -ne $null) }; ForEach($drive in $drives) {$drive.DriveLetter; ((Get-Item $drive.Name).GetAccessControl('Access')).Access}

在这里,我将解释脚本的每个部分:

将所有硬盘条目存储到$ drives

$drives = get-wmiobject win32_volume | ? { ($_.DriveType -eq 3) -and 
($_.DriveLetter -ne $null) }

循环浏览每个硬盘驱动器实例并打印硬盘驱动器名称

ForEach($drive in $drives) {$drive.DriveLetter;

通过传递$ drive.Name作为驱动器名称参数

,打印给每个驱动器的ACL权限
((Get-Item $drive.Name).GetAccessControl('Access')).Access}

今天我发现了一些非常时髦的东西...如果我执行我之前提到的命令,我会得到一个包含6个不同ACL项的条目,如下所示:

PS C:\Users\lopezcha> $drives = get-wmiobject win32_volume | ? { ($_.DriveType -eq 3) -and ($_.DriveLetter -ne $null) };
 ForEach($drive in $drives) {$drive.DriveLetter; ((Get-Item $drive.Name).GetAccessControl('Access')).Access}
C:


FileSystemRights  : Modify, Synchronize
AccessControlType : Allow
IdentityReference : NT AUTHORITY\Authenticated Users
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : InheritOnly

FileSystemRights  : AppendData, Synchronize
AccessControlType : Allow
IdentityReference : NT AUTHORITY\Authenticated Users
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

FileSystemRights  : ReadAndExecute, Synchronize
AccessControlType : Allow
IdentityReference : NT AUTHORITY\Authenticated Users
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : NT AUTHORITY\SYSTEM
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : BUILTIN\Administrators
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : ReadAndExecute, Synchronize
AccessControlType : Allow
IdentityReference : BUILTIN\Users
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

但是,如果我直接将驱动器名称作为文本传递而不是使用$ drive.Letter,那么我只获得3个ACL项而不是6个

PS C:\Users\lopezcha> ((Get-Item 'C:').GetAccessControl('Access')).Access


FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : NT AUTHORITY\SYSTEM
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : BUILTIN\Administrators
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : AMERICAS\lopezcha
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

有没有人知道为什么会出现这种情况?

编辑:我发现了一些有趣的东西......如果我使用“C:”作为驱动器名称,我会得到3个ACL,但如果我使用“C:\”,我会得到6个ACL。这部分回答了我的问题,但我仍然想知道为什么返回权限数量的差异。

$ drive.DriveLetter = C: $ drive.Name = C:\

1 个答案:

答案 0 :(得分:0)

这可能比您预期的更简单。这是因为提供商。术语c:是指提供程序在指定驱动器上使用的当前文件夹位置。虽然c:\指的是该驱动器的根文件夹。

让我用另一种方式来提供更好的参考。回到我开始使用计算机时,屏幕上只有绿色和黑色,我们使用软盘相当多。现在,如果我想将一些文件从软盘复制到c:\ temp我要做的是先更改到硬盘上的临时文件夹,然后更改为软盘驱动器,然后将文件复制到c:驱动器。它看起来像这样:

C:\> cd temp
C:\temp> cd a:
A:\> copy *.* c:

这会将a:驱动器中的所有文件复制到我在c:驱动器上的最后一个文件夹。

这同样适用于此,例如,当您c:作为参考时,它正在查看(最有可能)您正在执行命令的当前文件夹。

如果您不是立即展开“访问”属性,这将变得更加明显,因为基础对象会告诉您正在查看权限的文件夹的名称。