https://www.submarinecablemap.com
nettoyer windows de ses outils inutiles (bloatware) Bulk Crap Uninstaller GitHub – Klocman/Bulk-Crap-Uninstaller: Remove large amounts of unwanted applications quickly.
Autounattend pour démarrage windows 11
Generate autounattend.xml files for Windows 10/11
un doute sur un programme que vous souhaitez retirer ? : Should I Remove It?
https://www.shouldiremoveit.com/
Récupérer des données effacées sur un disque dur : Autopsy — Digital
Forensics < https://www.autopsy.com/>
optimiser windows pour de meilleures performance (pas en entreprise ! !)
AtlasOS — An optimized modification of Windows, designed for gamers. https://atlasos.net/
Sauvegarder le code dans un fichier nommé Check-Device.ps1.
Lancer PowerShell.
Exécuter la commande suivante pour forcer le lancement si la politique d’exécution bloque les scripts locaux : powershell.exe -ExecutionPolicy Bypass -File .\Check-Device.ps1
Code diagnostic :
$ReportPath = "$env:TEMP\Etat_Poste_Entreprise.html"
$Head = @"
<meta charset="utf-8">
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f9f9f9; color: #333; margin: 20px; }
h2 { border-bottom: 2px solid #005a9e; padding-bottom: 5px; color: #005a9e; }
table { border-collapse: collapse; width: 100%; margin-bottom: 20px; background-color: #fff; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
th { background-color: #f2f2f2; font-weight: bold; width: 30%; }
.cmd { font-family: Consolas, monospace; background-color: #eef1f5; padding: 4px 8px; border-radius: 3px; font-weight: bold; color: #c7254e; }
.table-compact th { background-color: #e1edf7; width: auto; }
.section-header { background-color: #d0e0ec; font-weight: bold; text-align: center; }
</style>
"@
$HtmlContent = @"
<!DOCTYPE html>
<html>
<head>$Head</head>
<body>
<h1>Rapport d'État du Poste Client</h1>
"@
function New-HtmlTable {
param([PSCustomObject]$Object)
$html = "<table>"
$Object.psobject.properties | ForEach-Object {
$html += "<tr><th>$($_.Name)</th><td>$($_.Value)</td></tr>"
}
$html += "</table>"
return $html
}
# 1. Informations Générales
$IsAdmin = (New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
$OsInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction SilentlyContinue
$CompInfo = Get-CimInstance Win32_ComputerSystem -ErrorAction SilentlyContinue
$IpAddress = (Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | Where-Object { $_.InterfaceAlias -notmatch "Loopback|Pseudo" } | Select-Object -ExpandProperty IPAddress) -join ", "
$GenInfo = [PSCustomObject]@{
"Nom de l'appareil" = $env:COMPUTERNAME
"Domaine" = if ($CompInfo.Domain) { $CompInfo.Domain } else { "Non détecté" }
"Adresse IP (IPv4)" = if ($IpAddress) { $IpAddress } else { "Non détectée" }
"Système d'exploitation" = if ($OsInfo) { $OsInfo.Caption } else { "Accès refusé" }
"Utilisateur actif" = $env:USERNAME
"Droits locaux" = if ($IsAdmin) { "Administrateur Local" } else { "Utilisateur Standard" }
}
$HtmlContent += "<h2>1. Informations Générales</h2>" + (New-HtmlTable $GenInfo)
# 2. Statut d'Enrôlement Simplifié
$DsregcmdStatus = dsregcmd /status
$AadJoined = ($DsregcmdStatus | Select-String "AzureAdJoined : YES") -ne $null
$TenantId = ($DsregcmdStatus | Select-String "TenantId :") -replace ".*TenantId : ","" -replace "\s+",""
$MdmUrl = ($DsregcmdStatus | Select-String "MdmUrl :") -replace ".*MdmUrl : ","" -replace "\s+",""
$EnrollInfo = [PSCustomObject]@{
"Jointure Azure AD" = if ($AadJoined) { "Oui" } else { "Non" }
"Tenant ID" = if ($TenantId) { $TenantId } else { "Non détecté" }
"Gestionnaire MDM" = if ($MdmUrl) { "Configuré" } else { "Non détecté" }
}
$HtmlContent += "<h2>2. Statut d'Enrôlement (Résumé)</h2>" + (New-HtmlTable $EnrollInfo)
# 3. Restrictions et Stratégies
$CmdRestricted = (Get-ItemProperty -Path "HKCU:\Software\Policies\Microsoft\Windows\System" -Name "DisableCMD" -ErrorAction SilentlyContinue).DisableCMD -eq 1
$RegRestricted = (Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\System" -Name "DisableRegistryTools" -ErrorAction SilentlyContinue).DisableRegistryTools -eq 1
$UacStatus = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "EnableLUA" -ErrorAction SilentlyContinue).EnableLUA -eq 1
$PolInfo = [PSCustomObject]@{
"Accès Invite de Commande (CMD)" = if ($CmdRestricted) { "Bloqué par GPO/MDM" } else { "Autorisé" }
"Accès Éditeur de Registre" = if ($RegRestricted) { "Bloqué par GPO/MDM" } else { "Autorisé" }
"UAC (Contrôle des comptes)" = if ($UacStatus) { "Actif (Demande d'élévation)" } else { "Désactivé ou Inaccessible" }
}
$HtmlContent += "<h2>3. Restrictions Détectées (Contexte Utilisateur)</h2>" + (New-HtmlTable $PolInfo)
# 4. Sécurité
$Defender = (Get-Service WinDefend -ErrorAction SilentlyContinue).Status
$Firewall = (Get-Service mpssvc -ErrorAction SilentlyContinue).Status
$SecInfo = [PSCustomObject]@{
"Service Windows Defender" = if ($Defender) { $Defender } else { "Accès Refusé" }
"Service Pare-feu Windows" = if ($Firewall) { $Firewall } else { "Accès Refusé" }
}
$HtmlContent += "<h2>4. Posture de Sécurité (Accès Limité)</h2>" + (New-HtmlTable $SecInfo)
# 5. Commandes de Diagnostic
$HtmlContent += "<h2>5. Rappel : Commandes de Diagnostic et Reconnexion</h2>"
$HtmlContent += "<table>"
$HtmlContent += "<tr><th>Rafraîchir les GPO</th><td><span class='cmd'>gpupdate /force</span></td></tr>"
$HtmlContent += "<tr><th>Rapport des GPO appliquées</th><td><span class='cmd'>gpresult /r</span></td></tr>"
$HtmlContent += "<tr><th>Vérifier la connexion au Tenant</th><td><span class='cmd'>dsregcmd /status</span></td></tr>"
$HtmlContent += "<tr><th>Forcer le renouvellement du jeton (PRT)</th><td><span class='cmd'>dsregcmd /RefreshPrt</span></td></tr>"
$HtmlContent += "<tr><th>Ouvrir le menu de synchronisation MDM</th><td><span class='cmd'>start ms-settings:workplace</span></td></tr>"
$HtmlContent += "</table>"
# 6. Processus en cours
$HtmlContent += "<h2>6. Processus en cours d'exécution (Contexte Utilisateur)</h2>"
$HtmlContent += "<table class='table-compact'>"
$HtmlContent += "<tr><th>Nom du Processus</th><th>PID</th><th>Mémoire (Mo)</th></tr>"
$Processes = Get-Process -ErrorAction SilentlyContinue | Select-Object Name, Id, @{Name="MemMB";Expression={[math]::Round($_.WorkingSet / 1MB, 2)}} | Sort-Object Name
foreach ($Proc in $Processes) {
$HtmlContent += "<tr><td>$($Proc.Name)</td><td>$($Proc.Id)</td><td>$($Proc.MemMB)</td></tr>"
}
$HtmlContent += "</table>"
# 7. dsregcmd /status détaillé
$HtmlContent += "<h2>7. Détails d'Enrôlement (Résultat brut de dsregcmd /status)</h2>"
$HtmlContent += "<table>"
$HtmlContent += "<tr><th>Paramètre</th><th>Valeur</th><th>Commentaire / Signification</th></tr>"
$DsregDict = @{
"AzureAdJoined" = "Jonction native au cloud (Azure AD/Entra ID). YES = Géré par l'entreprise."
"EnterpriseJoined" = "Jonction à l'infrastructure locale (ADDS). Souvent lié à l'état Hybride."
"DomainJoined" = "Membre d'un domaine Active Directory local classique."
"Device Name" = "Nom de la machine enregistré dans l'annuaire Microsoft."
"DeviceId" = "Identifiant unique de cet appareil dans le tenant (locataire) cloud."
"Thumbprint" = "Empreinte du certificat d'identité cryptographique de l'appareil."
"DeviceCertificateValidity" = "Période de validité du certificat d'identité de la machine."
"KeyContainerId" = "Identifiant du conteneur de clé matérielle."
"KeyProvider" = "Composant fournissant le stockage des clés (ex: Microsoft Platform Crypto Provider)."
"TpmProtected" = "Indique si les identités sont protégées matériellement par la puce TPM. YES est attendu pour la sécurité."
"DeviceAuthStatus" = "État d'authentification de l'appareil auprès des serveurs. SUCCESS est attendu."
"TenantName" = "Nom principal de l'entreprise ou domaine par défaut M365."
"TenantId" = "Identifiant unique global du locataire de votre entreprise."
"Idp" = "Serveur d'identité utilisé (Identity Provider), généralement login.windows.net."
"MdmUrl" = "URL du serveur d'enrôlement MDM (ex: Microsoft Intune)."
"MdmTouUrl" = "URL des conditions d'utilisation (Terms of Use) de l'entreprise."
"MdmComplianceUrl" = "URL utilisée par le système pour valider si l'appareil respecte les règles de conformité."
"SettingsUrl" = "URL du portail de paramètres du compte utilisateur."
"JoinSrvVersion" = "Version de l'API d'enregistrement."
"JoinSrvUrl" = "URL du service d'enregistrement des appareils Microsoft."
"JoinSrvId" = "URN de l'application de jonction."
"KeySrvVersion" = "Version du service de provisionnement de clés."
"KeySrvUrl" = "URL du service de gestion de clés cloud."
"KeySrvId" = "URN du service de clés."
"WebAuthNSrvVersion" = "Version du service WebAuthN (Authentification sans mot de passe)."
"WebAuthNSrvUrl" = "URL du service d'authentification forte."
"WebAuthNSrvId" = "URN du service WebAuthN."
"DeviceManagementSrvVer" = "Version du protocole de gestion d'appareil."
"DeviceManagementSrvUrl" = "URL du service de gestion d'appareil (lié au MDM)."
"DeviceManagementSrvId" = "URN du service de gestion."
"NgcSet" = "Indique si un code PIN (Windows Hello for Business) est configuré pour l'utilisateur. (YES = Actif)."
"NgcKeyId" = "Identifiant de la clé Windows Hello associée."
"CanReset" = "Indique si l'utilisateur est autorisé à réinitialiser son code PIN depuis l'écran de verrouillage."
"WorkplaceJoined" = "Appareil personnel enregistré (BYOD). Sur un PC d'entreprise, ceci est généralement NO."
"WamDefaultSet" = "Indique si un compte par défaut est configuré dans le Web Account Manager (SSO Windows)."
"WamDefaultAuthority" = "Autorité gérant le WAM (généralement 'organizations')."
"WamDefaultId" = "URL de l'autorité de compte par défaut."
"WamDefaultGUID" = "GUID du fournisseur WAM."
"AzureAdPrt" = "Jeton de rafraîchissement principal (PRT). Si YES : L'authentification unique (SSO) fonctionne, accès cloud autorisé."
"EnterprisePrt" = "Jeton PRT pour l'infrastructure réseau locale."
"AzureAdPrtUpdateTime" = "Date et heure de la dernière mise à jour/vérification du jeton PRT cloud."
"AzureAdPrtExpiryTime" = "Date d'expiration théorique du jeton PRT si le PC reste hors ligne."
"AzureAdPrtAuthority" = "Serveur d'autorité ayant délivré le PRT."
"EnterprisePrtUpdateTime" = "Dernière mise à jour du jeton PRT local."
"EnterprisePrtExpiryTime" = "Expiration du jeton PRT local."
"EnterprisePrtAuthority" = "Serveur d'autorité local (ex: ADFS)."
"AcquirePrtDiagnostics" = "Diagnostic de l'obtention du jeton. PRESENT indique un état nominal."
"PreviousPrtsDiagnostics" = "État des jetons précédents (pour le dépannage)."
"ServerErrorCode" = "Code d'erreur remonté en cas de problème de synchronisation (vide si tout va bien)."
"ServerMessage" = "Message descriptif du serveur lors d'une erreur."
"HttpsStatus" = "Code de réponse HTTP du serveur lors de la dernière connexion. (200 = OK)."
"PreReqResult" = "État de validation des prérequis de connexion."
"IsUserAzureAD" = "L'utilisateur actuellement connecté est-il un compte Azure AD ?"
"PolicyEnabled" = "Les stratégies liées au composant sont-elles activées ?"
"PostLogonEnabled" = "L'enregistrement post-connexion est-il activé ?"
}
foreach ($line in $DsregcmdStatus) {
$cleanLine = $line.Trim()
# Ignorer les bordures et lignes vides
if ([string]::IsNullOrWhiteSpace($cleanLine) -or $cleanLine -match "^\+-+\+$" -or $cleanLine -match "^\|.*\|$") {
continue
}
# Détecter les en-têtes de section (lignes sans le caractère ":")
if ($cleanLine -notmatch ":") {
$HtmlContent += "<tr><td colspan='3' class='section-header'>$cleanLine</td></tr>"
continue
}
# Séparer la clé de la valeur
$parts = $cleanLine -split ":", 2
$key = $parts[0].Trim()
$val = $parts[1].Trim()
# Assigner le commentaire
$comment = "Donnée technique interne ou information de diagnostic non documentée."
if ($DsregDict.ContainsKey($key)) {
$comment = $DsregDict[$key]
}
$HtmlContent += "<tr><td><strong>$key</strong></td><td>$val</td><td>$comment</td></tr>"
}
$HtmlContent += "</table>"
$HtmlContent += "</body></html>"
[System.IO.File]::WriteAllText($ReportPath, $HtmlContent, [System.Text.Encoding]::UTF8)
Invoke-Item $ReportPath