param()
$Computers = Get-ADComputer -Filter { enabled -eq $true } -Properties ms-Mcs-AdmPwd,OperatingSystem,LastLogonTimeStamp,msLaps-EncryptedPassword
#.CSS Style
$Header = ''
#.Header
$Precontent = "
LAPS (Local Admin Password Solution)
"
$Precontent += "Rapport d'avancement du déploiement du "+ (Get-Date -format "dd/MM/yyyy - HH:mm:ss") + "
"
#.Grabing collection
[System.Collections.Generic.List[PSObject]]$result = @()
foreach ($cptr in $Computers)
{
$LapsSet = $false
$LapsType = $null
if ($cptr.'ms-Mcs-AdmPwd' -or $cptr.'msLaps-EncryptedPassword')
{
$LapsSet = $true
if ($cptr.'ms-Mcs-AdmPwd')
{
$LapsType = "Legacy"
}
if ($cptr.'msLaps-EncryptedPassword')
{
switch($LapsType)
{
"Legacy" { $LapsType += ' & Modern' }
Default { $LapsType = "Modern" }
}
}
}
$object = [PSCustomObject][ordered]@{
ComputerName = $cptr.sAMAccountName
OS = $Cptr.OperatingSystem
LAPS = $LapsSet
Type = $LapsType
LastLogon = [DateTime]::FromFileTime($cptr.LastLogonTimeStamp)
}
$result.Add($object)
}
#.Exporting Result as html report
$TotalCptr = $Computers.Count - @(Get-ADDomainController -Filter *).count # @ in case of only one DC
$LapsDone = ($result | Where-Object { $_.LAPS -eq $true }).count
$LapsToDo = ($result | Where-Object { $_.LAPS -eq $False }).count
$LapsCover = [int]($LapsDone / $TotalCptr * 100)
$Precontent += '
'
$Precontent += "Progression : $LapsCover% - [fait = $LapsDone] [reste à faire = $LapsToDo]
"
$Precontent += '
'
$reportHtml = $result | ConvertTo-Html -Fragment -PreContent $Precontent -Property @('ComputerName','OS','LAPS','Type','LastLogon')
# $PSScriptRoot to export script in the same path in case of scheduled task
ConvertTo-Html -Body $reportHtml -Head $Header | Out-File $PSScriptRoot\LAPS-DailyReport-Laps.html -Force
$result | Select-Object ComputerName,OS,LAPS,Type,LastLogon | Export-Csv $PSScriptRoot\LAPS-DailyReport-Laps.csv -Delimiter ";" -NoTypeInformation -Force