这个 "access" 属性 来自我的 DirectorySecurity 对象的哪里?
Where is this "access" property coming from on my DirectorySecurity object?
我正在阅读一些代码,但我无法弄清楚某个 属性 访问权限是从哪里检索的。
这是我正在查看的代码片段。我已经删除了一些代码。此代码是函数的一部分,因此是 return 语句,但 func 代码的其余部分与此 post 无关。
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(),然后在 return 中取回 DirectorySecurity 对象。代码运行正常并且 access 属性 执行 return 数据,但我无法在 Microsoft 文档中找到有关此 Access 属性 来自何处的任何信息。它没有在 DirectorySecurity 对象上列为 属性。我是否缺少 DirectorySecurity 继承自的某些对象?
如有任何帮助,我们将不胜感激。谢谢
PowerShell 的类型系统,有时称为扩展类型系统(或 ETS),通过透明地将本机 .NET 对象包装在 PSObject
中工作,这反过来又允许我们扩展类型而无需实际修改类型和底层对象的标识。
在您的特定情况下,Access
属性 来自添加到 System.Security.AccessControl.ObjectSecurity
实例的一组动态属性。
深入研究 Get-TypeData
公开的类型数据,我们甚至可以看到它映射到 class 公开的静态方法,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
请注意它是 CodeProperty
而不是常规的 Property
。未列为 Method
、Property
或 Event
的任何内容都是特定于 PowerShell 的成员。
我正在阅读一些代码,但我无法弄清楚某个 属性 访问权限是从哪里检索的。
这是我正在查看的代码片段。我已经删除了一些代码。此代码是函数的一部分,因此是 return 语句,但 func 代码的其余部分与此 post 无关。
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(),然后在 return 中取回 DirectorySecurity 对象。代码运行正常并且 access 属性 执行 return 数据,但我无法在 Microsoft 文档中找到有关此 Access 属性 来自何处的任何信息。它没有在 DirectorySecurity 对象上列为 属性。我是否缺少 DirectorySecurity 继承自的某些对象?
如有任何帮助,我们将不胜感激。谢谢
PowerShell 的类型系统,有时称为扩展类型系统(或 ETS),通过透明地将本机 .NET 对象包装在 PSObject
中工作,这反过来又允许我们扩展类型而无需实际修改类型和底层对象的标识。
在您的特定情况下,Access
属性 来自添加到 System.Security.AccessControl.ObjectSecurity
实例的一组动态属性。
深入研究 Get-TypeData
公开的类型数据,我们甚至可以看到它映射到 class 公开的静态方法,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
请注意它是 CodeProperty
而不是常规的 Property
。未列为 Method
、Property
或 Event
的任何内容都是特定于 PowerShell 的成员。