我有一个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 AUTHORITY\SYSTEM}
@{IdentityReference=BUILTIN\Administrators}
@{IdentityReference=COMP1234\PCUser}
方法2输出与上面相同但一次输出一次。
我想要的是通过管道传递个人身份参考,甚至foreach也没关系,但我不明白这个@ {}的东西是什么意思可能意味着对象但我如何获得以下输出:< / p>
Permission 1 : NT AUTHORITY\SYSTEM
Permission 2 : BUILTIN\Administrators
Permission 3 : COMP1234\PCUser
我想将权限字符串传递给函数,并将其显示为上面的字符串。
答案 0 :(得分:1)
由于这个原因,你的函数正在强制传入它的任何字符串:
param([String] $p)
这意味着它正在传回一个字符串,删除该字符串,它将传回一个FileSystemAccessRule对象:
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'
答案 1 :(得分:0)
是的,@{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:\some\folder' | Write-IdentityReference