PSAclReport.psm1

function Convert-AclToHtml {
    <#
        .SYNOPSIS
            [Descriptif en quelques mots]
        .DESCRIPTION
            [Descriptif en quelques lignes]
        .PARAMETER Acls
            
        .EXAMPLE
            Convert-AclToHtml
        .NOTES
            Alban LOPEZ 2019
            alban.lopez@gmail.com
            http://git/PowerTech/
        #>


    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true)] $Acls = $null
    )
    begin {
        "`t<ul>`n"
    }
    process {
        foreach ($Acl in $Acls) {
            # $Acl | Write-Object -back black -fore Yellow
            if ($acl.account.sid -match '^S-1-5-21-') {
                "`t`t<li>`n"
                $Domain = $acl.account.AccountName -replace('^(.+)\\(.+)$','$1.adds')
                if($Domain -match '^coaxis-asp.adds$'){
                    $Domain = 'coaxis-asp.com'
                }
                $item = [adsi]"LDAP://$domain/<SID=$($acl.account.sid)>"
                "`t`t`t<span class='fa-stack fa-lg'>`n"
                if ($item.Properties.objectclass -contains 'group') {
                    "`t`t`t`t<i class='fa fa-users fa-stack-1x'></i>`n"
                } elseif($item.Properties.objectclass -contains 'user') {
                    "`t`t`t`t<i class='fa fa-user-circle-o fa-stack-1x'></i>`n"
                }
                if ($acl.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Deny) {
                    "`t`t`t<i class='fa fa-ban fa-stack-2x text-danger' title='Refus!'></i>`n"
                }
                "`t`t`t</span>`n"
                switch -regex ($acl.AccessRights) {
                    '^FullControl' {
                        "`t`t`t<i class='fa fa-flag-checkered text-success' title='Control total&#13;[$($acl.AccessRights)]'></i>`n"
                    }
                    '^Modify' {
                        "`t`t`t<i class='fa fa-pencil-square-o text-info' title='Modification&#13;[$($acl.AccessRights)]'></i>`n"
                    }
                    '^ReadAndExecute' {
                        "`t`t`t<i class='fa fa-eye text-muted' title='Lecture seule&#13;[$($acl.AccessRights)]'></i>`n"
                    }
                    Default {
                        "`t`t`t<i class='fa fa-tags text-warning' title='$($acl.AccessRights)'></i>`n"
                    }
                }
                "`t`t`t<i class='fa fa-long-arrow-right text-muted'></i>`n"
                "`t`t`t<a class='text-info' href='#$([System.Web.HttpUtility]::HtmlEncode($item.properties.name.tostring()))' title='$([System.Web.HttpUtility]::HtmlEncode($acl.account.AccountName))&#13;$($acl.account.Sid)'>$([System.Web.HttpUtility]::HtmlEncode($item.properties.name.tostring()))</a>`n"
                "`t`t`t<i class='fa fa-long-arrow-right text-muted'></i>`n"

                $InheritanceFlags = ""
                $thiFolder = $subFolder = $files = 'muted'
                switch -regex ($acl.InheritanceFlags) {
                    'ContainerInherit' {
                        $InheritanceFlags = "This folder, subfolders, and files&#13;[$($acl.InheritanceFlags)]"
                        $thiFolder = 'warning'
                        $subFolder = 'warning'
                        $files = 'warning'
                        break
                    }
                    'ObjectInherit' {
                        $InheritanceFlags = "Subfolders and files only&#13;[$($acl.InheritanceFlags)]"
                        $subFolder = 'warning'
                        $files = 'warning'
                        break
                    }
                    'none' {
                        $InheritanceFlags = "This folder only&#13;[$($acl.InheritanceFlags)]"
                        $thiFolder = 'warning'
                        break
                    }
                    Default {
                        $InheritanceFlags = "<!> $($acl.InheritanceFlags) <!>"
                    }
                }
                "`t`t`t<span title='$InheritanceFlags'>`n"
                "`t`t`t`t<i class='fa fa-folder-open text-$thiFolder'></i>`n"
                "`t`t`t`t<i class='fa fa-folder-open-o text-$subFolder'></i>`n"
                "`t`t`t`t<i class='fa fa-file-text text-$files'></i>`n"
                "`t`t`t</span>`n"
                "`t`t</li>`n"
            }
        }
    }
    end {
        "`t</ul>`n"
    }
}
function Get-ChildInheritance {
    <#
        .SYNOPSIS
            Construction d'objet Item Inherited
        .DESCRIPTION
            Construit un objet pour un affiche TreeView de l'etat d'heritage ou une sortie Out-GridView
        .PARAMETER Paths
            Chemin ou pattern a analyser
        .EXAMPLE
            Contruit l'object pour le Current Diretory
            Get-InheritanceTree
        .EXAMPLE
            liste 3 niveau de repertoure, genere les objets
            Get-ChildItem '\\vfs1\share$\data\TEST' -Recurse -Depth 3 -Force -Directory | Get-InheritanceTree | Out-GridView
        .NOTES
            Alban LOPEZ 2018
            alban.lopez@gmail.com
            http://git/PowerTech/
        #>

    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true)]
            $Paths = $null,
            [int]$Depth = 1,
            [switch]$html,
            [switch]$full
    )
    begin {
        # write-host -BackgroundColor Yellow " ${Depth} " -fore Red
    }
    process {
        foreach($path in $Paths){
            if($path -isnot [System.IO.FileSystemInfo]){
                get-item $path -Force | Get-ChildInheritance -depth ($Depth) -html:$html
            } else {
                Write-LogStep "Analyse ACL $($path.Name)",$path.fullName ok
                try {
                    try {
                        $acl = $path | Get-NTFSAccess -ExcludeInherited:(!$full) -ErrorAction Stop | Where-Object {$_.account -like '*\*'} | ForEach-Object {
                            [PSCustomObject]@{
                                Account           = $_.Account
                                AccessControlType = $_.AccessControlType
                                AccessRights      = $_.AccessRights
                                InheritanceFlags  = $_.InheritanceFlags
                            }
                        }
                    } catch {
                        $Acl = (Get-Acl $path).Access | Where-Object {($full -or !$_.IsInherited ) -and $_.IdentityReference -like '*\*'} | ForEach-Object {
                            [PSCustomObject]@{
                                Account           = $_.IdentityReference
                                AccessControlType = $_.AccessControlType
                                AccessRights      = $_.FileSystemRights
                                InheritanceFlags  = $_.InheritanceFlags
                            }
                        }
                    }
                    $Obj = [PSCustomObject]@{
                        Name        = $Path.Name
                        FullName    = $Path.FullName
                        Inheritance = [bool]!$path.IsInheritanceBlocked
                        SpecificAcl = $acl
                    }
                } catch {
                    $Obj = [PSCustomObject]@{
                        Name        = $Path.Name
                        FullName    = $Path.FullName
                        Inheritance = !$path.IsInheritanceBlocked
                        SpecificAcl = "Get-NTFSAccess > $($_.ToString())"
                    }
                    write-host -ForegroundColor Red $_
                }
                if ($html) {
                    # Write-LogStep "Convert ACL as Html ",$path.fullName ok
                    $md5 = Get-Hash -stream $obj.fullname
                    "<ul>`n"
                    "<li title='$([System.Web.HttpUtility]::HtmlEncode($obj.fullname))'>`n"
                    "`t<input type='checkbox' id='$md5'$(if($Depth -gt 1){' checked'})/>`n"
                    "`t<label for='$md5'>`n"
                    "`t`t<i class='fa fa-angle-double-right'></i> $([System.Web.HttpUtility]::HtmlEncode($Obj.Name))&nbsp;`n"
                    "`t</label>`n"
                    "`t<span class='acl'>`n"
                    "`t`t<input type='checkbox' id='${md5}_ACL' />`n"
                    "`t`t<i class='fa fa-long-arrow-right text-muted'></i>`n"
                    
                    if (!$Obj.Inheritance) {
                        "`t`t<label for='${md5}_ACL'> <i class='fa fa-shield text-danger' title='Rupture d&apos;heritage a partir de ce niveau'></i> </label>`n"
                    } elseif ($Obj.SpecificAcl) {
                        "`t`t<label for='${md5}_ACL'> <i class='fa fa-shield text-info' title='Propagation des droits parent + Specifique'></i> </label>`n"
                    } else {
                        "`t`t<label for='$(Get-Hash -stream (split-path $obj.fullname))_ACL'> <i class='fa fa-shield text-warning' title='Droits du parent Uniquement'></i> </label>`n"
                    }
                    $obj.SpecificAcl | Convert-AclToHtml
                    "`t</span>`n"
                } else {
                    $Obj
                }
                if($Depth -gt 1 -and $path.PSIsContainer){
                    get-childitem $Path.FullName | Get-ChildInheritance -depth ($Depth-1) -html:$html
                } elseif($html) {
                    "`t<ul><li><a href='$([System.Web.HttpUtility]::HtmlEncode($Path.FullName))'>$((get-childitem $Path.FullName).count) elements</a></li></ul>`n"
                }
                if ($html) {
                    "</li>`n"
                    "</ul>`n"
                }
            }
        }
    }
    end {
    }
}
function Export-InheritanceAsHtml {
    <#
        .SYNOPSIS
            [Descriptif en quelques mots]
        .DESCRIPTION
            [Descriptif en quelques lignes]
        .PARAMETER Paths
            
        .PARAMETER depth
            
        .PARAMETER full
            
        .PARAMETER OutFile
            
        .PARAMETER template
            
        .EXAMPLE
            Export-InheritanceAsHtml
        .NOTES
            Alban LOPEZ 2019
            alban.lopez@gmail.com
            http://git/PowerTech/
        #>


    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true)] $Paths = $null,
        [int]$depth = 3,
        [switch]$full,
        $OutFile = "$([Environment]::GetFolderPath("MyDocuments"))\Export.html",
        $template = "$($Global:RDS.path)\Ressources\AddOns\Template-BootStrap_FontAwesome.html"
    )
    begin {
        # $PSBoundParameters | Write-Object -back black -fore red
        $style = " <style>
        body {
            /* height: fit-content; */
            /* overflow: hidden; */
        }
        .main {
            margin-top: 60px;
        }
        div {
            overflow-y: auto;
            height :fill;
        }
        input { display: none; }
        ul {
            overflow: hidden;
            transition-property: max-height;
            transition-duration: 0.5s;
            transition-timing-function: linear;
            transition-delay: 0s;
        }
        input ~ ul { max-height: 0;height: 0; }
        input:checked ~ ul { max-height: inherit;height: auto; }
        label { margin-bottom: 0px; cursor: pointer; }
        label:hover { font-style: italic; }
        .acl li { border-left: 1px solid gray; max-height: 2em; }
        .fa-angle-double-right { transition: transform .5s ease-out; }
        input:checked ~ label .fa-angle-double-right { transform: rotate(90deg); }
        ul li {
            display: block;
            font-family: 'Arial';
            font-size: 15px;
            padding: 0px 0.2em;
        }
        ul li:hover {
            /* border: 1px solid grey; */
            border-radius: 3px;
            background-color: rgba(211, 211, 211, 0.3);
        }
        .top-bar {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            z-index: 5050;
            background-color: #fafafb;
            transition: box-shadow cubic-bezier(.165, .84, .44, 1) .25s;
            height: 50px;
            box-sizing: border-box;
            font-family: Arial,`"Helvetica Neue`",Helvetica,sans-serif;
            border-top: 3px solid #F48024;
            position: fixed;
            min-width: auto;
            box-shadow: 0 1px 0 rgba(12,13,14,0.1), 0 1px 6px rgba(59,64,69,0.1);
        }
        .logo {
            box-sizing: content-box;
            padding: 0 12px;
            height: 100%;
            transition: background-color cubic-bezier(.165, .84, .44, 1) .25s;
            align-items: center;
            color: #07C;
            text-decoration: none;
            cursor: pointer;
            display: flex;
            flex: 1 0 auto;
        }
        .logo64 {
            background-image: url('data:image/png;base64,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') ;
            background-repeat:no-repeat;
            background-color: transparent;
            width: 215px;
            height: 50px;
            margin-top: -4px;
        }
        .btn>input ~ .legend { max-height: 0;height: 0; position: absolute;right: 0;}
        .btn>input:checked ~ .legend { max-height: inherit;height: auto; display: block;}
        </style>`n </head>`n"


        $content = ([System.IO.File]::ReadAllText($template))
        
        $content = ([regex]'</head>').replace(
            $content,
            $style,
            1)
    $TopBar = "<body>
        <header class='top-bar'>
        <div class='d-flex justify-content-between'>
            <div class='p-2'>
                <a href='http://coaxis-asp.fr' class='logo'>
                    <span class='logo64'></span>
                </a>
            </div>
            <div class='p-3'>
                Export des Droits ($(get-date))
            </div>
            <div class='p-0'>
                <a class='btn btn-default' href='https://docs.microsoft.com/fr-fr/dotnet/api/system.security.accesscontrol.filesystemrights?view=netframework-4.8#champs'>
                    <i class='fa fa-book fa-2x' title='Details sur les droits NTFS'></i>
                </a>
                <a class='btn btn-default' href='https://docs.microsoft.com/fr-fr/dotnet/api/system.security.accesscontrol.inheritanceflags?view=netframework-4.8#champs'>
                    <i class='fa fa-info-circle fa-2x' title='Detail sur la propagation des droits'></i>
                </a>
                <span class='btn btn-default legend'>
                    <input type='checkbox' id='legend'/>
                    <label for='legend'>
                        <i class='fa fa-question-circle fa-2x' title='Afficher la legende des icones'></i>
                    </label>
                    <div class='legend list-group'>
                        <span class='list-group-item list-group-item-action' title='Rupture d'heritage a partir de ce niveau'>
                            <div class='d-flex w-100 justify-content-between'>
                                <i class='fa fa-shield text-danger'></i>
                                <small>Inheritance</small>
                            </div>
                            <small class='text-left'>Droits specifie a partir de ce niveau</small>
                        </span>
                        <span class='list-group-item list-group-item-action' title='Droits du parent Uniquement'>
                            <div class='d-flex w-100 justify-content-between'>
                                <i class='fa fa-shield text-warning'></i>
                                <small>Inheritance</small>
                            </div>
                            <small class='text-left'>Droits strinctement idantique au parent</small>
                        </span>
                        <span class='list-group-item list-group-item-action' title='Propagation des droits parent + Specifique'>
                            <div class='d-flex w-100 justify-content-between'>
                                <i class='fa fa-shield text-info'></i>
                                <small>Inheritance</small>
                            </div>
                            <small class='text-left'>Droits du prarent mais avec quelques ajouts</small>
                        </span>

                        <span class='list-group-item list-group-item-action' title='XXX'>
                            <div class='d-flex w-100 justify-content-between'>
                                <i class='fa fa-group'></i>
                                <small>Allow</small>
                            </div>
                            <small class='text-left'>Droits specifie a partir de ce niveau</small>
                        </span>
                        <span class='list-group-item list-group-item-action' title='XXX'>
                            <div class='d-flex w-100 justify-content-between'>
                                <i class='fa fa-user-circle-o'></i>
                                <small>Allow</small>
                            </div>
                            <small class='text-left'>Droits appliques a un groupe</small>
                        </span>
                        <span class='list-group-item list-group-item-action' title='Deny access'>
                            <div class='d-flex w-100 justify-content-between'>
                                <span class='fa-stack fa-sm'>
                                    <i class='fa fa-users fa-stack-1x'></i>
                                    <i class='fa fa-ban fa-stack-2x text-danger' title='Refus!'></i>
                                </span>
                                <small>Deny</small>
                            </div>
                            <small class='text-left'>Refus d'un ou plusieur droits sur ce compte</small>
                        </span>

                        <span class='list-group-item list-group-item-action' title='FullControl'>
                            <div class='d-flex w-100 justify-content-between'>
                                <i class='fa fa-flag-checkered text-success'></i>
                                <small>AccessRights</small>
                            </div>
                            <small class='text-left'>Controle total (Gestion des droits, ...)</small>
                        </span>
                        <span class='list-group-item list-group-item-action' title='Modify'>
                            <div class='d-flex w-100 justify-content-between'>
                                <i class='fa fa-pencil-square-o text-info'></i>
                                <small>AccessRights</small>
                            </div>
                            <small class='text-left'>Modification du nom et du contenu</small>
                        </span>
                        <span class='list-group-item list-group-item-action' title='Read Only'>
                            <div class='d-flex w-100 justify-content-between'>
                                <i class='fa fa-eye text-muted'></i>
                                <small>AccessRights</small>
                            </div>
                            <small class='text-left'>Droit de lecture uniquement</small>
                        </span>
                        <span class='list-group-item list-group-item-action' title='Specials'>
                            <div class='d-flex w-100 justify-content-between'>
                                <i class='fa fa-tags text-warning'></i>
                                <small>AccessRights</small>
                            </div>
                            <small class='text-left'>Droit specifique, voir les details au survol</small>
                        </span>
                    </div>
                </span>
            </div>
        </div>
    </header>
    <div class='main'>`n"

        $content = ([regex]'<body>').replace(
            $content,
            $TopBar,
            1)
        # $body = @()
        [System.IO.File]::WriteAllText($OutFile, $content)
        Write-LogStep "Export ACL ",$path.fullName ok
    }
    process {
        foreach ($path in $paths) {
            $bodyAppend = $path | Get-ChildInheritance -Depth $depth -full:$full -html
            $content = ([regex]'</body>').replace(
                $content,
                "$bodyAppend`n</body>`n",
                1)
            [System.IO.File]::WriteAllText($OutFile, $content)
        }
    }
    end {
        $content = ([regex]'</body>').replace(
            $content,
            "</div>`n</body>`n",
            1)
        [System.IO.File]::WriteAllText($OutFile, $content)
        return $OutFile
    }
}

Write-LogStep 'Chargement du module ',$PSCommandPath ok