在Powershell中获取文件夹和权限

时间:2016-06-30 09:36:39

标签: powershell directory

我在powershell脚本中以递归方式获取具有各自权限的文件夹列表,但是当递归部分发生时,我的输出字符串会在每次执行此示例时继续打印文件夹结构:

我有一个名为C:\ temp的文件夹,该文件夹中有2个空文件夹C:\ temp \ folder1和C:\ temp \ folder2。使用我的脚本输出将是:

我遗漏了可读性权限

C:\temp
C:\temp\folder1
C:\temp
C:\temp\folder2

我不希望发生这种情况我想要一个包含其权限的文​​件夹列表,然后如果子文件夹的权限不同,请查看获取该文件夹的子文件夹。这与弦乐建筑不同,我认为我需要一双新眼睛来看它,因为我无处可去。

提前感谢帮助,

山姆

CODE:

Add-Type -AssemblyName System.Windows.Forms
Import-Module ActiveDirectory
$info = ""
$OutputString
$step = 0
function DisplayForm{

#Some GUI code
#$textBox takes in the base folder from the user

    if ($result -eq [System.Windows.Forms.DialogResult]::OK)
    {
        $baseFolder = $textBox.Text

        $ParentProperties = (Get-Acl $baseFolder).Access| Select-Object -ExpandProperty IdentityReference
        $OutputString = $OutputString + $baseFolder + "`r`n" + $ParentProperties + "`r`n`r`n"
        $ChildFolders = Get-ChildItem $baseFolder | where {$_.Attributes -eq 'Directory'}

        FindPriorities($baseFolder)


        $info = "SAVED TO FOLDER"
        outputList

    }
}

function FindPriorities{
    param($fileName)
    $ChildFolders = Get-ChildItem $fileName | where {$_.Attributes -eq 'Directory'}
    $step = $step + 1
    $TempString = ""
    foreach ($folder in $ChildFolders){
        $child = $fileName + "\\" + $folder.name

    $ParentProperties = (Get-Acl $fileName).Access| Select-Object -ExpandProperty IdentityReference
    $ChildProperties = (Get-Acl $child).Access| Select-Object -ExpandProperty IdentityReference
    $parentString=""

    foreach ($p in $ParentProperties){
        $parentString= $parentString + $p
    }
    $childString=""
    foreach ($c in $childProperties){
        $childString = $childString + $c
    }

    if($childString -ne $parentString){
        $OutputString = $OutputString + $child + "`r`n" + $ChildProperties + "`r`n`r`n"
        FindPriorities ($child)
    }else{
        $OutputString = $OutputString + $child + "`r`n" + $ChildProperties + "`r`n`r`n"
    }

}
}

function outputList{
    $OutputString

}


DisplayForm

1 个答案:

答案 0 :(得分:2)

我想我明白你想做什么。

请尝试使用此代码段:

function Get-IdentityReference($path) {    
    Get-Acl $path |
        Select-Object -ExpandProperty Access |
        Select-Object -ExpandProperty IdentityReference    
}

function Extract-Permissions($baseFolder) {
    $folders = Get-ChildItem $baseFolder | Where-Object { $_.PSisContainer }
    $baseACL = Get-IdentityReference $baseFolder

    "$baseFolder : $baseACL"

    foreach($folder in $folders) {
        $folderACL = Get-IdentityReference $folder.FullName
        $childFolders = Get-ChildItem $folder.FullName | Where-Object { $_.PSisContainer }

        "$($folder.FullName) : $folderACL"

        foreach($childFolder in $childFolders) {
            $childACL = Get-IdentityReference $childFolder.FullName

            if(Compare-Object $childACL $folderACL) {
                Extract-Permissions $childFolder.FullName
            } else {
                "$($childFolder.FullName) : $childACL"
            }
        }
    }
}

$baseFolder = "$env:USERPROFILE\Desktop"

Extract-Permissions $baseFolder