diff --git a/checksecsysvolBeta.ps1 b/checksecsysvolBeta.ps1 new file mode 100644 index 0000000..6aff9da --- /dev/null +++ b/checksecsysvolBeta.ps1 @@ -0,0 +1,332 @@ + +function Find-SMSClearTextPassword { + [CmdletBinding()] + Param( + [Parameter(Mandatory = $false)] + [String]$dnsDomain = $env:USERDNSDOMAIN, + + [Parameter(Mandatory = $false)] + [String[]]$ignoreExtensions # Tableau pour stocker les extensions à ignorer + ) + +# Tester l'acces au partage +$testpath = Test-Path "\\$dnsDomain\sysvol\" +if ($testpath -eq $false) { +throw "Cannot access domain or share, pls check with GCI $dnsDomain" +} + +# Tester la présence de module +if (!(Get-Module -ListAvailable -Name "PSWriteHTML")) +{ + Write-Host "ReportHTML Module is not present, attempting to install it" -ForegroundColor Red + Install-Module -Name PSWriteHTML,PSWriteOffice,PSWritePDF -Force -Scope CurrentUser + Import-Module PSWriteHTML -ErrorAction SilentlyContinue +} + +# Suppression de runspace "fantomes" +$PreviousRS = get-runspace | where-object {($_.id -ne 1)} +if ($PreviousRS) { $PreviousRS.dispose() } + +$Results = $null + +# Début du script : obtenir la date et l'heure actuelles +$startDate = Get-Date + + #region getxmlcontenant + # Récupérer les extensions de fichiers à partir du fichier XML + $xmlFileExtensions = "C:\temp\file_extensions.xml" + $extensionsXML = [xml](Get-Content $xmlFileExtensions) + $fileExtensions = $extensionsXML.FileExtensions.Extension + + # Récupérer les motifs de mots de passe à partir du fichier XML + $xmlPasswordPatterns = "C:\temp\password_patterns.xml" + $passwordPatternsXML = [xml](Get-Content $xmlPasswordPatterns -Encoding UTF8) + $passwordPatterns = $passwordPatternsXML.PasswordPatterns.Pattern + + # Récupérer les fichiers dans les dossiers Sysvol du domaine DNS spécifié + #$sysvolFolders = Get-ChildItem -Path "\\$dnsDomain\sysvol" -Recurse -File -Include $fileExtensions -ErrorAction SilentlyContinue + + # Initialiser une liste pour stocker les résultats + $Results = @() + + #endregion getxmlcontenant + +# définition du Pool (creation des slots) +$pool = [RunspaceFactory]::CreateRunspacePool(1,10) +$pool.ApartmentState = "MTA" +$pool.Open() +$runspaces = @() + + +$scriptblock = { + Param ( + [string]$sysfiles, + [string[]]$passwordPatterns + ) + + # Définir les commandes pour chaque type de fichier + $fileCommands = @{ + '.docx' = { + $results = @() # Initialisation de la variable $results dans le scriptblock + Import-Module PSWriteOffice + $document = Get-OfficeWord -FilePath $sysfiles -ReadOnly + foreach ($pattern in $passwordPatterns) { + $var = $document.Find($pattern) | Select-Object -First 1 + if ($var) { + $result = [PSCustomObject]@{ + FilePath = $sysfiles + pattern = '' + Word = $pattern + } + $results += $result + } + } + Close-OfficeWord -Document $document + $results # Retourne tous les résultats à la fin du scriptblock + } + '.xlsx' = { + $results = @() # Initialisation de la variable $results dans le scriptblock + Import-Module PSWriteOffice -Force -Global -Scope Local + $excel = Get-OfficeExcel -FilePath $sysfiles + + foreach ($pattern in $passwordPatterns) { + $var = $excel.Search($pattern) | Select-Object -First 1 + + if ($var) { + $result = [PSCustomObject]@{ + FilePath = $sysfiles + pattern = '' + Word = $pattern + } + $results += $result + } + } + $results # Retourne tous les résultats à la fin du scriptblock + } + '.pdf' = { + $results = @() # Initialisation de la variable $results dans le scriptblock + Import-Module PSWritePDF + $text = (Convert-PDFToText -FilePath $sysfiles) -join "`n" + + foreach ($pattern in $passwordPatterns) { + if ($text -match $pattern) { + $result = [PSCustomObject]@{ + FilePath = $sysfiles + pattern = '' + Word = $pattern + } + $results += $result + } + } + $results # Retourne tous les résultats à la fin du scriptblock + } + default = { + $results = @() # Initialisation de la variable $results dans le scriptblock + $matches = Select-String -Path $sysfiles -Pattern $passwordPatterns -AllMatches + $n= 0 + + foreach ($match in $matches) { + $patternMatch = $match.Matches.Value + [string]$word= $match.line.Replace($patternMatch,'') + + #if ($word -replace '^[=:"]', '' -ne '') { + if (-not([string]::IsNUllOrEmpty($word -replace '^[=:"]'))) { + $n++ + $result = [PSCustomObject]@{ + FilePath = $sysfiles + pattern = $patternMatch + Word = $match.Line + } + + $results += $result + } + + if ($n -eq 2) { + + # Retourne tous les résultats à la fin du scriptblock + break; + } + } + + $results # Retourne tous les résultats à la fin du scriptblock + } + } + + # Obtenir l'extension du fichier + $extension = [System.IO.Path]::GetExtension($sysfiles).ToLower() + + # Exécuter la commande appropriée en fonction de l'extension du fichier + if ($extension -like '*.doc*' -and $fileCommands.ContainsKey('.docx')) { + & $fileCommands['.docx'] + } + if ($fileCommands.ContainsKey($extension)) { + & $fileCommands[$extension] + } else { + & $fileCommands['default'] + } +} + + +$fichiertraite = 0 +# creation des jobs par machine et lancement des jobs + +Get-ChildItem -Path \\$dnsDomain\sysvol -Recurse -File -Include $fileExtensions -Exclude $ignoreExtensions -Force -ErrorAction Continue | ForEach-Object { + +$fichiertraite++ +$sysfiles = $_.FullName + +#clear +Write-Host nous traitons $sysfiles + +$runspace = [PowerShell]::Create() +$null = $runspace.AddScript($scriptblock) +$null = $runspace.AddArgument($sysfiles) +$null = $runspace.AddArgument($passwordPatterns) +$runspace.RunspacePool = $pool +$runspaces += [PSCustomObject]@{ Pipe = $runspace; Status = $runspace.BeginInvoke() } +} + + +# Afficher les slots + statistiques en cours +while ($runspaces.Status -ne $null) +{ +start-sleep 1 +#cls +get-runspace | where-object {($_.id -ne 1) -and ($_.runspaceisremote -eq $false) -and ($_.runspaceAvailability -like "Available")} +get-runspace | where-object {($_.id -ne 1) -and ($_.runspaceisremote -eq $true)} +$slt_encours = get-runspace | where-object {($_.id -ne 1) -and ( $_.runspaceisremote -eq $true)} +$slt_tot = get-runspace | where-object {($_.id -ne 1) -and ($_.runspaceisremote -eq $false)} + +write-host "Nbre Objets total= " $runspaces.count +write-host "Nbre slots totaux= " $slt_tot.count +write-host "Nbre slots utilisés= " $slt_encours.count +write-host "Nbre objets restants =" $runspaces.Status.IsCompleted.count + +$completed = $runspaces | Where-Object { $_.Status.IsCompleted -eq $true } + +foreach ($runspace in $completed) +{ + $Results += $runspace.Pipe.EndInvoke($runspace.Status) + $runspace.Status = $null +} + +} + +# Regroupement : + +#region Top5 +$sortedGroups = $Results.filepath | Group-Object | Sort-Object -Property Count -Descending + +# Sélectionner les 5 premiers groupes +$top5Groups = $sortedGroups | Select-Object Count,Name -First 5 + +# Afficher les 5 premiers groupes +$commonPath = "\\ENI.LOCAL\sysvol\eni.local" +$top5Groups = $top5Groups | ForEach-Object { + $_.Name = $_.Name -replace [regex]::Escape($commonPath), '' + $_ +} + +# Top 5 word +$top5Words= $Results.pattern | Group-Object | Sort-Object -Property Count -Descending | Select-Object Count,name -First 5 + +#nombre d'objet max +$objettrouve = $sortedGroups.Count + +# Regrouper les chemins de fichier par extension de fichier +$groupedFiles = $sortedGroups.name | Group-Object -Property { ($_ -split "\.")[-1] } | select Count,name + +# Fin du script : obtenir la date et l'heure actuelles +$endDate = Get-Date + +# Calculer la différence de temps +$elapsedTime = New-TimeSpan -Start $startDate -End $endDate +$elapsedTime = $($elapsedTime.ToString("hh\:mm\:ss")) + +#endregion Top5 + +# Fermeture les connexions et suppression des slots du Pool +$pool.Close() +$pool.Dispose() + +# Generation du rapport HTML +New-HTML -TitleText 'AD_ModernReport' -ShowHTML { + +New-HTMLHeader { + New-HTMLText -LineBreak + New-HTMLSection -Invisible { + + New-HTMLPanel -Invisible { + New-HTMLText -LineBreak + New-HTMLText -Text "Sysvol ClearPass Check : $($dnsDomain)" -Alignment left -FontSize 30 -FontWeight bold -Color Blue + New-HTMLText -Text "Report date: $startDate" -Alignment left -FontSize 15 + New-HTMLText -Text "Elapsed : $elapsedTime" -Alignment left -FontSize 15 + } -AlignContentText left + + New-HTMLPanel -Invisible -AlignContentText right { + New-HTMLImage -Source 'C:\temp\logo.png' -Class 'otehr' -Width '30%' + } + + } + New-HTMLText -LineBreak + } + + New-HTMLSection { + New-HTMLTableOption -DataStore JavaScript + New-htmlTable -HideFooter -DataTable $Results -TextWhenNoData 'Information: No Groups were found' + } + + New-HTMLSection { + + New-HTMLPanel { + New-HTMLPanel -Width "60%" { + New-HTMLChart -Gradient -Title 'Total traitement' -TitleAlignment center -Height 200 { + New-ChartTheme -Palette palette4 + New-ChartPie -Name 'Objets totale' -Value $runspaces.count + New-ChartPie -Name 'Objets trouvés' -Value $objettrouve + } + } + New-HTMLPanel -Width "60%" { + New-HTMLChart -Gradient -Title 'Types extension' -TitleAlignment center -Height 200 { + New-ChartTheme -Mode light + $groupedFiles.GetEnumerator() | ForEach-Object { + New-ChartPie -Name $_.name -Value $_.count + } + } + + + + } + } + + + New-HTMLPanel { + New-HTMLChart -Title 'Top 5 Files' -TitleAlignment center { + New-ChartToolbar -Download pan + New-ChartBarOptions -Gradient + New-ChartLegend -Name $top5Groups.name[0],$top5Groups.name[1],$top5Groups.name[2],$top5Groups.name[2],$top5Groups.name[2] -HideLegend + New-ChartBar -Name 'Patch extensions' -Value $top5Groups.GetEnumerator().count[0],$top5Groups.GetEnumerator().count[1],$top5Groups.GetEnumerator().count[2],$top5Groups.GetEnumerator().count[2],$top5Groups.GetEnumerator().count[2] + } + } + + + New-HTMLPanel { + New-HTMLChart -Title 'Top 5 Word' -TitleAlignment center { + New-ChartToolbar -Download pan + New-ChartBarOptions -Gradient + New-ChartLegend -Name $top5Words.name[0],$top5Words.name[1],$top5Words.name[2],$top5Words.name[3],$top5Words.name[4] -HideLegend + New-ChartBar -Name 'Patch extensions' -Value $top5Words.GetEnumerator().count[0],$top5Words.GetEnumerator().count[1],$top5Words.GetEnumerator().count[2],$top5Words.GetEnumerator().count[3],$top5Words.GetEnumerator().count[4] + } + } + + + } + +} + +return $Results + +} + +# Appeler la fonction pour trouver les mots de passe en texte clair dans les fichiers Sysvol +$var= Find-SMSClearTextPassword \ No newline at end of file