Powershell :获取文件夹的唯一权限,并将每个权限应用于功能



我有一个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

最新更新