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

时间:2017-01-11 04:23:16

标签: 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 AUTHORITY\SYSTEM}
@{IdentityReference=BUILTIN\Administrators}
@{IdentityReference=COMP1234\PCUser}

方法2输出与上面相同但一次输出一次。

我想要的是通过管道传递个人身份参考,甚至foreach也没关系,但我不明白这个@ {}的东西是什么意思可能意味着对象但我如何获得以下输出:< / p>

Permission 1 : NT AUTHORITY\SYSTEM
Permission 2 : BUILTIN\Administrators
Permission 3 : COMP1234\PCUser

我想将权限字符串传递给函数,并将其显示为上面的字符串。

2 个答案:

答案 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