2017-01-11 9 views
0

フォルダのアクセス権を取得し、一意のIdentityReferenceのみを選択して単純な関数を適用しようとするPowerShellスクリプトがあります。しかし、何らかの理由でそれが機能していない。Powershell:フォルダのユニークなアクセス許可を取得し、それぞれに関数を適用します。

@{IdentityReference=NT AUTHORITY\SYSTEM} 
@{IdentityReference=BUILTIN\Administrators} 
@{IdentityReference=COMP1234\PCUser} 

:私は書き込み出力にそれが出力する第2の時間を行うときにのみ

私は2つの異なるアプローチを試してみました

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 } 

私のスクリプトは、方法1は、自分自身ではない何も出力しません方法2は上記と同じものを出力しますが、一度に1つずつ出力します。

私がしたいことはパイプライン、あるいはforeachのを経由して、個々のアイデンティティの参照を渡すことです大丈夫だと思うが、私はこの@ {}ものは多分それはオブジェクトを意味しているが、どのように、私は次の出力を得るのですかを理解していない:

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

権限文字列を関数に渡し、上記のように文字列として表示したいとします。

答えて

0

はい、@{IdentityReference=...}は、オブジェクト(PowerShellのオブジェクトの文字列表現)を表示していることを意味します。

ID参照の値を取得するには、プロパティを展開する必要があります。 2倍。

$acl | 
    Select-Object -Unique -Expand IdentityReference | 
    Select-Object -Expand value 

あなたはこのように、あなたの関数display_perm()にすでにフォーマットされた文字列を渡す必要があると思い番号付きリストでID参照する場合:

$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 
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' 
+0

値 ----- NT AUTHORITY \ SYSTEM BUILTIN \管理者、どのように私は-----値を取り除くか、ちょうどあなたが値を参照する必要があります –

+0

個々の値を表示、変更することができます最後の行は '(display_perm 'c:\ temp').IdentityReference.Value'です。 –

関連する問題