119 lines
3.9 KiB
PowerShell
119 lines
3.9 KiB
PowerShell
|
|
function Find-SMSClearTextPassword {
|
|
[CmdletBinding()]
|
|
Param(
|
|
[Parameter(Mandatory = $false)]
|
|
[String]$dnsDomain = $env:USERDNSDOMAIN
|
|
)
|
|
|
|
# Suppression de runspace "fantomes"
|
|
$PreviousRS = get-runspace | where-object {($_.id -ne 1)}
|
|
if ($PreviousRS) { $PreviousRS.dispose() }
|
|
|
|
$Results = $null
|
|
|
|
|
|
#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)
|
|
$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 = @()
|
|
|
|
# définition des commandes à executer dans les jobs
|
|
$scriptblock = {
|
|
Param (
|
|
[string]$sysfiles,
|
|
[string[]]$passwordPatterns
|
|
)
|
|
|
|
$content = Get-Content -Path $sysfiles -Raw;
|
|
$results = @() # Initialisation de la variable $results dans le scriptblock
|
|
|
|
foreach ($pattern in $passwordPatterns) {
|
|
if ($content -match $pattern) {
|
|
$result = [PSCustomObject]@{
|
|
FilePath = $sysfiles
|
|
#Pattern = $pattern
|
|
Word = $Matches[0]
|
|
}
|
|
$results += $result # Ajoute chaque résultat à la variable $results
|
|
}
|
|
}
|
|
|
|
$results # Retourne tous les résultats à la fin du scriptblock
|
|
}
|
|
|
|
|
|
# creation des jobs par machine et lancement des jobs
|
|
#foreach ($sysfiles in $sysvolFolders)
|
|
Get-ChildItem -Path "\\$dnsDomain\sysvol" -Recurse -File -Include $fileExtensions -Force -ErrorAction SilentlyContinue | ForEach-Object {
|
|
|
|
$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
|
|
}
|
|
|
|
}
|
|
|
|
$Results | Out-GridHtml
|
|
|
|
# Fermeture les connexions et suppression des slots du Pool
|
|
$pool.Close()
|
|
$pool.Dispose()
|
|
|
|
|
|
}
|
|
|
|
# Appeler la fonction pour trouver les mots de passe en texte clair dans les fichiers Sysvol
|
|
Find-SMSClearTextPassword |