【问题标题】:Getting folders and permissions in Powershell在 Powershell 中获取文件夹和权限
【发布时间】:2016-11-02 07:41:26
【问题描述】:

我在 powershell 脚本中递归地获取具有各自权限的文件夹列表,但是当递归部分发生时,我的输出字符串每次都会打印文件夹结构,例如:

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

为了便于阅读,我省略了权限

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

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

提前感谢帮助,

山姆

代码:

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

【问题讨论】:

  • DisplayForm 中的 foreach 代码与 FindPriorities 中的 foreach 代码相同,因此它们都运行了两次。 (foreach ($folder in $ChildFolders){ ... })。你还在函数DisplayForm结束时再次调用DisplayForm
  • 是的,这仅适用于基本文件夹中的子文件夹,然后如果它有一个具有不同权限的文件夹,则会进入该文件夹并找到子文件夹
  • ---文件夹1 -----------文件夹2(相同的权限)-----------文件夹3(不同的权限)---- ----------------------------------文件夹4......等等。我总是希望它回来并检查基本文件夹中的其余文件夹,这就是为什么我有这样的原因
  • 你能不能把根搜索文件夹($baseFolder)给FindPriorities,让它处理所有的子文件夹。那么你就不需要DisplayForm中的重复代码了吗?
  • 我可以,我现在就试一试,但是如果发现一个文件夹具有不同的权限,那难道不会跳过基础中的任何剩余文件夹吗?

标签: powershell directory


【解决方案1】:

我想我明白你想做什么了。

请试试这个 sn-p:

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

【讨论】:

  • 这似乎符合我的要求,我已将Where-Object { $_.PSisContainer } 更改为where {$_.Attributes -eq 'Directory'},因为出于某种原因它似乎不喜欢第一种方式。我认为有一个错误可能是因为某些文件夹没有子文件夹,但是一旦对其进行了排序,我认为这将起作用!谢谢。
  • 不客气。请阅读:stackoverflow.com/questions/3085295/…$_.Attributes -eq 'Directory' 在很多情况下都会失败,例如只读目录。
  • 是的,对不起,我一开始还以为是出错了,但现在我把它改回来了。给出错误的部分是函数 Get-IdentityReference,所以在这种情况下,我将调用它的每一行更改为 (Get-Acl $folder.FullName).Access | Select-Object -ExpandProperty IdentityReference 我将在完成后使用工作代码编辑我的问题,但这是我将选择的答案.
  • 由于这个位被使用了 3 次,我认为最好让它成为一个函数。
猜你喜欢
  • 2014-05-04
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2013-02-07
  • 2021-09-05
  • 2019-09-08
相关资源
最近更新 更多