使用PowerShell获取用户权限

1 前言

日常工作中,我们可能会需要查询某个用户在文件服务器上对哪些文件具有何种权限。这个需求看起来很简单,但实际操作起来却没那么容易。

icacls可以导出一个aclfile,但这个aclfile的内容很不友好,也难以搜索。如果牵扯到的文件非常多,基本无使用价值。Sysinternals有一个AccessChk工具倒是可以获取用户的权限,但目前的版本无法支持中文。

PowerShell可以实现这个需求。

2 脚本及解释

假设我们想知道cbz.com域的user用户(这个用户隶属于group组)在D盘对哪些文件具有何种权限,可使用下面脚本。

#使用Get-ChildItem获取需要查找权限的文件及文件夹
Get-ChildItem 'D:\' -Recurse -Force |` ForEach-Object { $i = $_
#使用System.IO.FileInfo.GetAccessControl().Access $_.GetAccessControl().Access |` Where-Object { $_.IdentityReference -match 'cbz\\user' -or` $_.IdentityReference -match 'cbz\\group'} |` Select-Object @{n="Path";e={$i.fullname}}, @{n="User";e={$_.IdentityReference}}, ` @{n="Permission";e={$_.FileSystemRights}}, @{n="Permission Type";e={$_.AccessControlType}}, ` @{n="IsInherited";e={$_.IsInherited}} } |` #ConvertTo-Csv -NoTypeInformation > D:\user.csv Export-Csv D:\user.csv -Encoding UTF8 -NoTypeInformation

本脚本的中心思想是使用Get-ChildItem获取到文件及文件夹的ACL,然后再使用Where-Object和Select-Object筛选你想要的ACE,最后输出为CSV文件。

具体点说,Get-ChildItem输出System.IO.FileInfo对象;System.IO.FileInfo 的GetAccessControl()方法输出System.Security.AccessControl.FileSecurity对象(这个对象就是ACL);System.Security.AccessControl.FileSecurity的Access属性(这个属性是CodeProperty,意思是本属性由PowerShell开发组添加)包含System.Security.AccessControl.FileSystemAccessRule对象(这个对象就是ACE);循环使用 Where-Object和Select-Object筛选System.Security.AccessControl.FileSystemAccessRule对象 ,就得到我们想要的结果。筛选及输出为CSV的细节就不过多解释了,稍微熟悉点PowerShell的应该都能看明白。

3 参考文档

3.1 get-acl for a particular user(这里有原始脚本,我的脚本是修改版)

3.2 PowerShell Tip: Getting enum values as names, int and bit(这篇文章有助于理解3.1脚本里面-bAND参数后面的数字,-bAND参数本身的含义可以参考about_Comparison_Operators)

3.3 Powershell : Get-ACL and get permissions for specific user on a remote folder(初接触3.1那篇文章的时候,我对PowerShell知之甚少,还看不懂里面的脚本。是本文的“The AccessToString property is just a blob of text representing the ACL. This is not suitable to filter on instead what one should do is to dive into the Access property and filter the access control entries (ACEs) on their IdentityReference property.”这句话让我茅塞顿开,从而根据需要修改出自己的版本)

3.4 Hey, Scripting Guy! Can I Determine a Folder’s Access Rights and Who Has Them? (这是用PowerShell获取文件系统权限的一个总体的解释,可惜我是先自己搞明白了3.1里脚本的含义,然后才看到的这篇文章)

Visits: 3213

此条目发表在PowerShell, Windows分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

7 + 7 =