我想检查给定用户是否有权访问给定文件夹 - 通过检查他们是否具有分配给他们的“修改”访问权限。

我认为那的 PS 将是:

(Get-Acl .\myfolder).Access | ?{$_.IdentityReference -eq "BUILTIN\Users"} |?{$_.filesystemrights.value -contains "Modify"}

但最后一部分不起作用 - 我没有得到任何结果。但我知道他们有修改访问权限 - 如果我输入:
(Get-Acl .\myfolder).Access | ?{$_.IdentityReference -eq "BUILTIN\Users"} | select -ExpandProperty filesystemrights

然后我回来:
Modify, Synchronize
ReadAndExecute, Synchronize

这是因为 FileSystemRights 属性是一个枚举吗?如果是这样,我如何对其进行测试?

最佳答案

是类型问题。 (Get-Acl .\myfolder).Access[].FileSystemRightsSystem.Security.AccessControl.FileSystemRights 类型。它并没有真正显示字符串。要使其成为字符串,只需使用 ToString() 方法:

(Get-Acl .\myfolder).Access | ?{$_.IdentityReference -eq "BUILTIN\Users"} |?{$_.filesystemrights.ToString() -contains "Modify"}

或者您可以使用按位比较方法。但是,当您想使用它时很容易混淆:
($_.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::Modify) -eq [System.Security.AccessControl.FileSystemRights]::Modify

当你想使用它时:
($_.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::Modify) -eq $_.FileSystemRights

它们有非常不同的含义。例如,如果您有完全控制,则前面的测试仍然是正确的。那是你要的吗?或者您想知道 FileSystemRights 何时实际上只是 Modify

此外,[System.Security.AccessControl.FileSystemRights] 是一个不完整的枚举。在我的环境中,我发现我需要这个表:
+-------------+------------------------------+------------------------------+
|    Value    |             Name             |            Alias             |
+-------------+------------------------------+------------------------------+
| -2147483648 | GENERIC_READ                 | GENERIC_READ                 |
|           1 | ReadData                     | ListDirectory                |
|           1 | ReadData                     | ReadData                     |
|           2 | CreateFiles                  | CreateFiles                  |
|           2 | CreateFiles                  | WriteData                    |
|           4 | AppendData                   | AppendData                   |
|           4 | AppendData                   | CreateDirectories            |
|           8 | ReadExtendedAttributes       | ReadExtendedAttributes       |
|          16 | WriteExtendedAttributes      | WriteExtendedAttributes      |
|          32 | ExecuteFile                  | ExecuteFile                  |
|          32 | ExecuteFile                  | Traverse                     |
|          64 | DeleteSubdirectoriesAndFiles | DeleteSubdirectoriesAndFiles |
|         128 | ReadAttributes               | ReadAttributes               |
|         256 | WriteAttributes              | WriteAttributes              |
|         278 | Write                        | Write                        |
|       65536 | Delete                       | Delete                       |
|      131072 | ReadPermissions              | ReadPermissions              |
|      131209 | Read                         | Read                         |
|      131241 | ReadAndExecute               | ReadAndExecute               |
|      197055 | Modify                       | Modify                       |
|      262144 | ChangePermissions            | ChangePermissions            |
|      524288 | TakeOwnership                | TakeOwnership                |
|     1048576 | Synchronize                  | Synchronize                  |
|     2032127 | FullControl                  | FullControl                  |
|   268435456 | GENERIC_ALL                  | GENERIC_ALL                  |
|   536870912 | GENERIC_EXECUTE              | GENERIC_EXECUTE              |
|  1073741824 | GENERIC_WRITE                | GENERIC_WRITE                |
+-------------+------------------------------+------------------------------+

比较这些输出很有趣:
[System.Enum]::GetNames([System.Security.AccessControl.FileSystemRights]);
[System.Enum]::GetNames([System.Security.AccessControl.FileSystemRights]) | % { "$($_.ToString())`t`t$([System.Security.AccessControl.FileSystemRights]$_.ToString())`t`t$(([System.Security.AccessControl.FileSystemRights]$_).value__)";}
[System.Enum]::GetValues([System.Security.AccessControl.FileSystemRights]) | % { "$($_.ToString())`t`t$(($_).value__)";}
GENERIC 权限未在 .Net 类中枚举,但如果枚举足够的文件,您将看到该数值。

祝你好运!

关于windows - 如何使用 Powershell 与 FileSystemRights 进行比较?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27529174/

10-09 01:51