我有一个Powershell脚本,它获取文件夹的权限,然后只选择唯一的IdentityReference,然后尝试对其应用一个简单的函数。 但是,由于某种原因它不起作用。
我的脚本
function display_perm {
param([String] $p)
Write-Output $p
}
$acl = $(Get-Acl "folderpath").Access
# Method 1
$perm = $acl | select -Unique IdentityReference | %{ display_perm $_ }
#write-output $perm
# Method 2
foreach($p in $perm) { display_perm $p }
我尝试了两种不同的方法,方法一只有在我第二次输出时进行写入输出时才自行输出任何内容:
@{IdentityReference=NT AUTHORITYSYSTEM}
@{IdentityReference=BUILTINAdministrators}
@{IdentityReference=COMP1234PCUser}
方法 2 确实输出与上述相同,但一次输出一个。
我想要的是通过管道传递单个身份引用,甚至 foreach 都可以,但我不明白这个@{}的东西是什么,也许它意味着对象,但我如何获得以下输出:
Permission 1 : NT AUTHORITYSYSTEM
Permission 2 : BUILTINAdministrators
Permission 3 : COMP1234PCUser
我想将权限字符串传递给函数并将其显示为上面的字符串。
由于以下原因,您的函数强制您传递给它的任何内容都是字符串:
param([String] $p)
这意味着它正在传递一个字符串,删除它,它将传递一个文件系统访问规则对象:
function display_perm {
param($p)
Write-Output $p
}
$acl = $(Get-Acl c:temp).Access
# Method 1
$acl | select -Unique IdentityReference | %{ display_perm $_ }
# Method 2
foreach($p in $acl) { display_perm $p.IdentityReference }
另一种选择是将处理移动到函数中,然后只将路径传递给函数:
function display_perm {
param(
[string]$path
)
$acl = Get-acl $path
$acl.Access | select -Unique IdentityReference
}
display_perm 'c:temp'
是的,@{IdentityReference=...}
表示你正在显示一个对象(它是PowerShell的对象的字符串表示形式)。
若要仅获取标识引用的值,需要展开属性。两次。
$acl |
Select-Object -Unique -Expand IdentityReference |
Select-Object -Expand value
如果您希望在编号列表中使用标识引用,则需要将已格式化的字符串传递到函数display_perm()
中,如下所示:
$i = 1
$acl |
Select-Object -Unique -Expand IdentityReference |
ForEach-Object { display_perm ('Permission {0} : {1}' -f $i++, $_.value) }
或者像这样:
$perm = $acl |
Select-Object -Unique -Expand IdentityReference |
Select-Object -Expand value
$i = 1
foreach($p in $perm) {
display_perm ('Permission {0} : {1}' -f $i++, $p)
}
最好在输出函数中处理整个输出:
function Write-IdentityReference {
Param(
[Parameter(
Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true
)]
[Security.AccessControl.DirectorySecurity[]]$Acl
)
Begin {
$formatString = 'Permission {0} : {1}'
}
Process {
$Acl | ForEach-Object {
$i = 1
$_.Access |
Select-Object -Unique -Expand IdentityReference |
ForEach-Object { $formatString -f $i++, $_.value }
}
}
}
Get-Acl 'C:somefolder' | Write-IdentityReference