Outils Divers

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