Как заставить переключатель -Depth работать в скрипте? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь ограничить глубину рекурсии для этого сценария, который генерирует список папок, связанных групп безопасности и членов каждой группы. Я использую PowerShell 5.1.

Я попытался добавить -Depth 3 в строке 18 (как показано ниже), но я все еще получаю все уровни. Я пытался добавить -Depth 3 в командной строке при запуске сценария, но это ошибки.

Это команда, которую я использовал для запуска скрипта:

./Get_folder_acls_depth_test.ps1 -Path I:\dir_name -Recurse | Export-Csv c:\temp\dir_name.csv

Я тоже это пробовал, но получил ошибку:

./Get_folder_acls_depth_test.ps1 -Path I:\dir_name -Recurse -Depth 3 | Export-Csv c:\temp\dir_name.csv

[CmdletBinding()]
Param(
    [ValidateScript({Test-Path $_ -PathType Container})]
    [Parameter(Mandatory=$true)]
    [string]$Path,
    [switch]$Recurse
)

Write-Verbose "$(Get-Date): Script begins!"
Write-Verbose "Getting domain name..."
$Domain = (Get-ADDomain).NetBIOSName

Write-Verbose "Getting ACLs for folder $Path"

if ($Recurse) {
    Write-Verbose "...and all sub-folders"
    Write-Verbose "Gathering all folder names, this could take a long time on bigger folder trees..."
    $Folders = Get-ChildItem -Path $Path -Directory -Recurse -Depth 3
} else {
    $Folders = Get-Item -Path $Path
}

Write-Verbose "Gathering ACL's for $($Folders.Count) folders..."
foreach ($Folder in $Folders) {
    Write-Verbose "Working on $($Folder.FullName)..."
    $ACLs = Get-Acl $Folder.FullName | ForEach-Object { $_.Access }
    foreach ($ACL in $ACLs) {
        if ($ACL.IdentityReference -match "\\") {
            if ($ACL.IdentityReference.Value.Split("\")[0].ToUpper() -eq $Domain.ToUpper()) {
                $Name = $ACL.IdentityReference.Value.Split("\")[1]
                if ((Get-ADObject -Filter 'SamAccountName -eq $Name').ObjectClass -eq "group") {
                    foreach ($User in (Get-ADGroupMember $Name -Recursive | Select -ExpandProperty Name)) {
                        $Result = New-Object PSObject -Property @{
                            Path = $Folder.Fullname
                            Group = $Name
                            User = $User
                            FileSystemRights = $ACL.FileSystemRights
                            AccessControlType = $ACL.AccessControlType
                            Inherited = $ACL.IsInherited
                        }
                        $Result | Select Path,Group,User,FileSystemRights
                    }
                } else {
                    $Result = New-Object PSObject -Property @{
                        Path = $Folder.Fullname
                        Group = ""
                        User = Get-ADUser $Name | Select -ExpandProperty Name
                        FileSystemRights = $ACL.FileSystemRights
                        AccessControlType = $ACL.AccessControlType
                        Inherited = $ACL.IsInherited
                    }
                    $Result | Select Path,Group,User,FileSystemRights
                }
            } else {
                $Result = New-Object PSObject -Property @{
                    Path = $Folder.Fullname
                    Group = ""
                    User = $ACL.IdentityReference.Value
                    FileSystemRights = $ACL.FileSystemRights
                    AccessControlType = $ACL.AccessControlType
                    Inherited = $ACL.IsInherited
                }
                $Result | Select Path,Group,User,FileSystemRights
            }
        }
    }
}
Write-Verbose "$(Get-Date): Script completed!"

Скрипт отлично работает для получения всех уровней, я просто хотел бы ограничить его уровнями 2-4.

1 Ответ

0 голосов
/ 11 января 2019

Я протестировал этот хакерский сценарий, чтобы убедиться, что ваш оператор if / else работал правильно, и я получил правильные результаты:

function Test-Recurse {
    Param(
        [ValidateScript( {Test-Path $_ -PathType Container})]
        [Parameter(Mandatory = $true)]
        [string]$Path,
        [switch]$Recurse
    )

    begin {
        Write-Verbose "$(Get-Date): Script begins!"
        $folders = $null
    }

    process {
        if ($Recurse) {
            Write-Output -InputObject "Recurse has been selected"
            $folders = Get-ChildItem -Path $Path -Directory -Recurse -Depth 3
        }
        else {
            Write-Output -InputObject "Recurse has NOT been selected"
            $folders = Get-ChildItem -Path $Path -Directory
        }
    }

    end {
        return $folders.fullName
    }
}

PS C: \ GitHub \ Guyver1wales \ PowerShell> Test-Recurse -Path c: \ programdata \ razer

Рекурс НЕ был выбран
C: \ ProgramData \ Razer \ Installer
C: \ programdata \ razer \ Razer Central
C: \ ProgramData \ Razer \ RzEndpointPicker
C: \ ProgramData \ Razer \ Services
C: \ ProgramData \ Razer \ ServiceSetup
C: \ programdata \ razer \ Synapse

PS C: \ GitHub \ Guyver1wales \ PowerShell> Test-Recurse -Path c: \ programdata \ razer -Recurse
Рекурс был выбран
C: \ ProgramData \ Razer \ Installer
C: \ programdata \ razer \ Razer Central
C: \ ProgramData \ Razer \ RzEndpointPicker
C: \ ProgramData \ Razer \ Services
C: \ ProgramData \ Razer \ ServiceSetup
C: \ ProgramData \ Razer \ Synapse
C: \ ProgramData \ Razer \ Installer \ Logs
C: \ programdata \ razer \ Razer Central \ Icons
C: \ programdata \ razer \ Razer Central \ Logs
C: \ programdata \ razer \ Razer Central \ Icons \ Dark
C: \ programdata \ razer \ Razer Central \ Иконки \ Стиль жизни
C: \ programdata \ razer \ Razer Central \ Icons \ Light
C: \ ProgramData \ Razer \ RzEndpointPicker \ Аккаунты
C: \ ProgramData \ Razer \ Services \ Logs
C: \ ProgramData \ Razer \ Synapse \ Accounts
C: \ ProgramData \ Razer \ Synapse \ CrashReporter
C: \ ProgramData \ Razer \ Synapse \ Devices
C: \ ProgramData \ Razer \ Synapse \ Logs
C: \ ProgramData \ Razer \ Synapse \ Маты
C: \ ProgramData \ Razer \ Synapse \ Modules
...
C: \ ProgramData \ Razer \ Synapse \ ProductUpdates \ Uninstallers
C: \ ProgramData \ Razer \ Synapse \ ProductUpdates \ Uninstallers \ RazerCommonConfig
C: \ ProgramData \ Razer \ Synapse \ ProductUpdates \ Uninstallers \ RazerDeathAdder3500Config
C: \ ProgramData \ Razer \ Synapse \ ProductUpdates \ Uninstallers \ RazerFonts
C: \ ProgramData \ Razer \ Synapse \ ProductUpdates \ Uninstallers \ Razer_Common_Driver
PS C: \ GitHub \ Guyver1wales \ PowerShell>

-Глубина начинается с 0, поэтому -Глубина 3 отображает 4 подпапки: C: \ ProgramData \ Razer \ Synapse \ ProductUpdates \ Uninstallers \ RazerDeathAdder3500Config

0 = \ Synapse

1 = \ ProductsUpdates

2 = \ Деинсталляторы

3 = \ RazerDeathAdder3500Config

...