powershell - 我的 DirectorySecurity 对象上的这个“访问”属性来自哪里?
问题描述
我正在阅读一些代码,但我无法弄清楚从哪里检索某个属性访问权限。
这是我正在查看的代码片段。我已经删除了一些代码。此代码是函数的一部分,因此是 return 语句,但 func 代码的其余部分与本文无关。
if ($targetObjType -eq "DirectoryInfo") {
$fileFolderObjs = @(Get-ChildItem $target -force -recurse -Directory -ErrorAction SilentlyContinue)
}
$fileFolderObjs | ForEach-Object {
$fileFolderObj = $_
try {
$ACL = $fileFolderObj.GetAccessControl()
}
catch {
write-host "error"
return
}
if (!$ACL) {
return
}
$access = $ACL | Select-Object -ExpandProperty Access #ACLs. Not seeing this property as existing in DirectorySecurity class documentation.
}
所以我应该检索 DirectoryInfo 对象,在它们上调用 GetAccessControl(),并返回一个 DirectorySecurity 对象。代码运行正常并且访问属性确实返回数据,但我在 Microsoft 文档中找不到有关此 Access 属性来自何处的任何信息。它未列为 DirectorySecurity 对象的属性。我是否缺少 DirectorySecurity 继承的某些对象?
任何帮助,将不胜感激。谢谢
解决方案
PowerShell 的类型系统,有时也称为扩展类型系统(或 ETS),其工作原理是将原生 .NET 对象透明地包装在 aPSObject
中,这反过来又允许我们在不实际修改底层对象的类型和标识的情况下扩展类型。
在您的特定情况下,该Access
属性来自一组添加到System.Security.AccessControl.ObjectSecurity
.
深入研究 公开的类型数据Get-TypeData
,我们甚至可以看到它映射到Get-Acl
派生类公开的静态方法:
$objectSecurityExtendedMembers = Get-TypeData -TypeName System.Security.AccessControl.ObjectSecurity|% Members
$objectSecurityExtendedMembers['Access']
尽管它不一定会告诉您它来自哪里,但它Get-Member
会显示Access
为 ETS(而不是本机 .NET)属性:
PS C:\> Get-Acl |Get-Member
TypeName: System.Security.AccessControl.DirectorySecurity
Name MemberType Definition
---- ---------- ----------
Access CodeProperty System.Security.AccessControl.AuthorizationRuleCollection Access{get=GetAccess;}
CentralAccessPolicyId CodeProperty System.Security.Principal.SecurityIdentifier CentralAccessPolicyId{get=GetCentra...
CentralAccessPolicyName CodeProperty System.String CentralAccessPolicyName{get=GetCentralAccessPolicyName;}
Group CodeProperty System.String Group{get=GetGroup;}
Owner CodeProperty System.String Owner{get=GetOwner;}
Path CodeProperty System.String Path{get=GetPath;}
Sddl CodeProperty System.String Sddl{get=GetSddl;}
AccessRuleFactory Method System.Security.AccessControl.AccessRule AccessRuleFactory(System.Security.Princ...
AddAccessRule Method void
注意它是如何说它是 aCodeProperty
而不是常规的Property
。未列为 的任何内容Method
,Property
或者Event
是特定于 PowerShell 的成员。
推荐阅读
- c# - 验证来自 Web 服务器的 JSON 响应
- wordpress - 谷歌机器人问题
- python - Kedro - 无法使用抽象方法 project_name、project_version 实例化抽象类 ProjectContext
- tcp -
- 无效的加载键,ZMQ socket.recv_pyobj() 中的 '\x00' - apache-spark - 如何在 spark sql 中使用数据透视函数
- reactjs - 模拟点击反应中的第一个节点
- python - 是否可以在 x 轴(经度)上移动 geopandas 世界地图?
- oracle - 如何使用 Ref 游标作为 Visual Basic 的 Out-parameter 调用 Oracle 函数
- c# - 如何判断 Unity 构建过程中出了什么问题?
- windows - 用于浏览器的 Powershell 更改