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 [$($acl.AccessRights)]'></i>`n" } '^Modify' { "`t`t`t<i class='fa fa-pencil-square-o text-info' title='Modification [$($acl.AccessRights)]'></i>`n" } '^ReadAndExecute' { "`t`t`t<i class='fa fa-eye text-muted' title='Lecture seule [$($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)) $($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 [$($acl.InheritanceFlags)]" $thiFolder = 'warning' $subFolder = 'warning' $files = 'warning' break } 'ObjectInherit' { $InheritanceFlags = "Subfolders and files only [$($acl.InheritanceFlags)]" $subFolder = 'warning' $files = 'warning' break } 'none' { $InheritanceFlags = "This folder only [$($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)) `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'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,iVBORw0KGgoAAAANSUhEUgAAAKcAAAAoCAYAAACb8OrhAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4wgBDC0PbUdRMgAAD89JREFUeNrtnX+0VVW1xz/n3Iv8RjJQCg+iAsLOYSFZGj6feTQLsxKldoqIlpaVpi49aj15/nzawU1glkYp+eu1UsEcSFh6Xj21oqeUPmkBiqgcQRExkMvvH+f9seeWxWbts/e598Ib473zHeOOe9l7rx97rbnmmvM759rkyADPDzBaRX/ngV7A/sBngdHA4cCHgf2kyDrgNWAh8BTwO2Al0Ga02hGvs4kmXMilCSVgC+YxwMnA6SKQjWABMBOYa7T6i6v+JprILJyWkA4DbgL+GejfwTbfBp4GrjJaLWlOQRNJyKdpTc8PzgaeA87oBMFEzIHTgfmeH4y322qiibrCaQlKL88PAuBeoPceaLsPcJ/nB1OyavAm/n+hNX7BaIXnBwOAGeLw7Gl8ilytN/BeczqaSLQ5RWv2Bh7cS4I5FxhvtHq3VCn0BdYCtXKx2pyZJsJtPeY1/+teEsw/AhNEMPsDTwA/jgSzVCm0q9L/DfvV84MOtZtUNmudWdqvd7+Rsu2tJ37P84Oc5wd5+cm5ns9Ff8h2fibwQDvGdyPwjvyuAd3Feeqe8Py8XK429u+/vPzNUqWwv7R5otw7r1yszihVCjSiQeO8qecHBwL9gJ5yaQOwGqgarWquMq7BtGi0vsAA2VnywBbgH8AKo9WWjgimjH1/6e8OudVmtFreCB/s+cEQoMVxa6XRak1K+x8WP6AW21lXGK3ei5UZAPSNPetswzGOBwEHA4fIeHYF3gVeB94AXjFa/QMgZ3VuKDC/QefHAPcBfwXeBNbL9Z7Ah4CRwDnACKvM72QrX1V6ctBAcrWZwCet+23AJ8rF6sKsAhoLEnwFOA0YbgkT0reVwMvAbKPVjCQBjdU3CpgAjCIMNPQVAdgkwv4K8HvgTqPVBs8PcpHwNyiccwEP2C63FgFfMFpta6Cu7wDfEyWRswTs18CVwJbYAo7a7iI7Wf+YwK0AzjJavR5r5xbgLGCrXNoGTDJa6Tp96wd8HzgJOMzl74iQGuABo9WdOavwg8C4jOOwDZgIPAxsjaI+jg7lgS5S731ABfiybOUDgNnAxx1FHykXq2MbnNzBUt/whBe3sYUwgjXeaPVsgoB2B34iFFrPFEZhu2jRC41WDzcaXPD84OPAs7HL62SsHm9wcT4PfDT2yA5gtNFqXsLY3SCCE39HZbSa4mjvLuC82Pt/y2g1PaF/g4E5sviyYnZkcx4NHJ+x0N+BoUarB4DNSYIpk7NDnrkf+ABwpghmP+D+BMEEOLZUKRydSXWHg3sa8Cph1Ko1Q7F9gGHAM54fHGVNbPS7QBh2nUgYqk2julpkS37I84NpQIv0K+tEXOu41hv4kucHrWn1xNo6Bdjs8C2meX7QEt9qPT84DBjveMenXYKZgFqdhdMNmNWgYNaA6XnRbp8lG8G+ABhjtHotTTNEDk30jNFqjdHq7VKlcIBo3GKddvoDY0qVQkuage35wdh22smINl8YORSWBn6yzsJJw8XAFBlXMvR/RB3FcJqYElkXKUar5cAlDoH5BHBZzInKA18HBseefVvabrejZ5X7nph3rt3rZVF262K78reNVo9FSRynZ9zKv2i0WhZNZtyjLlUKPUuVQg+AOl73JsIwaBq+DHRP8tplMg4EflHH8QJ4QWzpDbHrd8tW1GbVt4+s8mEp9T0l9lg9AZ1YT3taC3si0COhnv2B07JqYavOGWLbx3Gd5wcjjFbRs0MBl4Y5z2i1uiPJOVa5yx23nwE+TZinMQY4BrhC7t1otLoD2QIPIFsSx7lGq6V240ZDqVLoIh24WBwQSpXCO8APgVvLxeounmy5WF1bqhTGy7ZeD4cBB5aL1UV1bKxfJThw7wKXGa3usWiKFuALwHTgMaPV1xwO0VXAEY76NgE3A7eKs4HRqiZb4k8TFttdnh88ZLRaV0e7DAQ+k2I2TAKmNSIkRqvNnh9cKFrJXrjdgakiFAD3ONr+eSTYHU3I8fzgow7F0QacY8tSZC56fvDrKN/C8wPyGTnNhcCD0er9/PlTI604BJgH/FskmIJ+hIkify5VCkNtDSq/Z8nApeHUOg7Q8cCnHGX+DAwXwQSoGa1qRqttRqtZwGCj1UTh2WxHYqDsIHFT4i3gOKPV9UarDVF9Unax0ep44DrLy7bxw6StUa6NAj4WcyxejW3J+3l+MKFR3tNo9SrwHcftf/L84FTPD86JsSRI2zcbrbZ2EgW8X4Lz+FZCn5fYJlYeODZDI/cA26KJLBerlCqFVsJI0pF1yh0JPFyqFHLRNl8uVikXqxtlhabhhDrbxZUuPk+oj1XRCzqok7bI6I45Qoc7tGYN+Hzk0dvCbNdrtLqWMB0wjjM8P+hZh6q6KPb8YuBShza7thFNZtmfdzvGubsEWqY6il5htFraiYEMV0i6p5gXXVwEvT1neeAjGQj2vzq8cpVg6MZxBDCnVClMLVUKt0U/wnel8YFegmbok9Dv20RjOCcyJlBxb9a1NU8zWs13CbpjYC91lO8mtpVLeEZYgYcI/2W0elRsZBuDPD84vZ0OyiTgxdi1UcLXxsduJp0Io9V8K6gQoVUctkWeH0zy/OBge2zt98sDB6W08Y5LDScY0kn4HPBd0RTRz5gMFM2ghOtDEpyIn7RzHHMJdvejaRrL0lIrHFxlax0K5SaHEpglf9/soKq+3qj2lN9vitmxsc7ji4DLOjP5O+at4xiXQ6RfSz0/WOL5wUWeH+yLFVKPvPV62MDOyE9kN3ahc3I7O2LLdIlTE0arNe3cknKEEa24U/Vug57pPAe/2N9BHw2KqBrbJDFazZb6ZgLxUOCRQta3B7MIIy9J+JHRansna81o0f5A2IN6OBS4TZTgVZ4f9IlszvaghSY6gmsc1+6OaZypDlppTESkN4hThP1I3Po9P/hgg4GDRvAN4EzgbynPdZMd5U7PD1rzjhUaRw92Jk9ETs0mYPnemkkH17laSFwb+3h+0K+dW1KNMDcgrp33a3ALOyZ2awewKqZNBuEOQEyOaeGHhFu2cQHQvcFspQ8AN6TskAdEJkxna0/5vRXQMj4jCYMf9RiBrwLj8hmErL9jywP4UQP9fByYJmWin99kcIiWRR5+DEsSbKgL2jmONcLoVxxj05wQi9oqsHtUaZtjOx3jsKUfMFptirWznDBSZWOgsAeNkPKXxugqCNMT4570aM8PLt9Thw0lGWaz0ep5o9UEo9U+hHkLzyUI6sV5hyfnUrUjHeG4KYTZSGn4b2BMuVi9pFysXhz9yAClOUQvJrzougRhusjzg4NTuEUc93cA/5lQ31GRMLjqtCbTFYfeRJixFJXvLQLf4uJDY2zCWkIyPO7t3pzmtFi27QkOE+I10Ux3OIr+i2RhdSocaXPRv2carY4CbmT3fICRecJQUhomAO8nIEgq21bgK8DzKYI5rlys1mwSvlQpdI+8zxT8Rx0BKzueHwDcH9lPLg5NtjnXoC2Q/sYx2/ODoyO6w5p4u0/XOxwcgIeNVustXnOIUGi70EfA4gRN+LhtFggGS6JL4gKUfvYjPP/lcn5WA1cTpvvZ2Be40fODXp1lezrybF200Z3sHg7umpM8zpcytHO2ZBft0oCQ8ZcTJhX0tzzdKYThy80OG/Is0sOXAMPKxerLdSbgj7ijROuAC4FfWqZDXhyDnwMvGK1OctQ7SXjBFocGnAz8QNiLKHzpEYZDRyf0v48dvvT84D7CDKBdhgOYXCfp+UmHjfqC0epjKULhausVo9UQ65kjHZwqwAVGq5/VqTueMhcla0xPmKdBwO2EEatljqDEEbIQbfNxTZ4wqrIgg6DMiLbMqGHRoNvKxeot5WJ1fzEBepaL1Q+Wi9WbysXqZkdySA8xiFPNFOBNV+KH9XJfxR2F6C3Cv1Vsmvni+D0qC+hEzw8e8/ygZ2wF35KgPbvJ9tgm95/x/GAlYQg2STC/ZrRaZ2nafg5heRv4Qwq571Jhh8qW7TRVPD84JbKXYzjDMjGinc0lhNMlb6BDWUkimH2ljVNlvL7h+YHn+cEgzw8O8fzgWPFH4n7NUzmxJScRhrTSsAA4xWi1rAOe976ihc5PefQ64Ppysboj5eXHiiB2b0d3HgHOtzNwJGXut9TPTErDbeKI7LDMiemOd/4DcEJa5rznB8uA+CqdDnwzXtbzgx6EwYA4+T/FaKUc26wnjldcOBYCo4xWGx1l6mpOayy7EWbhnyw7WORjrCU8ktGV8MiGix47KS9hSZdt48LhwBzPDw7Juqqs1TzA84PB5WJ1LWH46o46xVYCc5IEM0ZTzCI8MtAevM//WaTxa4Rhxec6IJiXReFey/7zHTTTr6IkkhSK6gbH7ZNlYuPP3u4QzKXAj12OlNHKAHc5mJMRkZPXqAcv75wjJP+jDKhczLb9iNjgLsF8EHgmL5XNS/BWkwR0sXyto2u9pFq511W+GrIC+K3nBwPLxeqGWi13iWgul9Z4ulysPtvA9vEIYcLsiw5u0IUthCG70UarP8W9SaNVFTiOMFe0LQPltZ0wzDvOaPVdYHtM23wzzhVLH+6uN/mWA3Yvu+ejHgQcH8tqPxU410GT/cyRoma3c00CpXiW5wefyaCIco45qckOuTrD+NkL9i/AJUarTa3WIH5fpDzLAbdWsRuvBu71/OBv7H7AbaAQrmez84DbMOAJzw++NPlE9dKlvxk6rkvXTf9OmFgc4T0kHpvlgJul8V4HjpADbmNFI37Iep826eMS4FGj1b0ub9K6thE41/OD2+nAATfZZkcSni6M0AV4yGi1JWNC71axPc+zgg8t8p4zgJrQVFcSpr3FueI7MnjTZwpRvjnWz4meHzwt4xFhlWzL9gG39xxz8ns5EXqNsBTD2T3sHDmciwi/Y3B9xPnGjwaPz+isxLFROhyd+usmUYeuCc+/LFrmhVKl0FUG/ttyb2K5WL2nk44G92dngsgGYJXR6o2kMincXLuOBnt+0FUWqj0peWB5/MhtimnUR+qxTZ0WwMjc9ZLFE+eO1xut3kh7V6ljuEPLtQAv2adAsx4NduTLHio73IHiI6wThbEUWCpJKu+XyzkqCbDOmuxBvAR8zmi1VHjPXwBvlItVlVVrZhHSvYGkbJ60vnRWX7O0U898yNIPS4AbqsfFc7LrN7p2JPGgrs/R9CKM6+6Nr34sBE42WlWveOKg1sknvb6tvULZxP895BJWwN78kNcy4BjJh2yiiV1sH5cafovwQwi37oU+zBFPt4km6guntf+3Ga2uEA5x3R5oez3hKbxvsXv6WxNNZP7s9lDCE5bHESa9dgTvEH52+2qj1eLmFDTRLuF00CmfJDwP1J7/sMAQRgzmGq3+lMWLbKIpnA1RFdZ/9XKAOEzHEoaiBrGT8F5DGBFaQPj1srmEIcn10VmV5n/10kQa/gfnxV1AAE6tkAAAAABJRU5ErkJggg==') ; 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 |