Čt. Bře 13th, 2025
ukázka powershell ISE se skriptem pro promazání uživatelských profilů, které se nepřihlásily déle než 90 dní

Než začnete nadávat v komentářích pod příspěvkem, že se to dá vyřešit pomocí group policy, tak vám dám sice za pravdu, ale pokud potřebujete udělat nějaké výjimky, na nějaké konkrétní uživatele, tak toho už jsem se úplně nedopátral a bylo proto nutné sepsat powershell skript, který problém vyřeší za vás.
Testováno na Windows 10, bude fungovat i na Windows 11. Sice mám mnohem raději bash skriptování, ale doba pokročila a pokud si vytočíte např. jazykový model doma na vlastní kartě a umíte promptit, tak dokážete napsat za pár minut to, co by jinak zkušenému powershellákovi trvalo i jednotky hodin s veškerým odladěním a otestováním a googlením bugů, na které při implementaci narazí.

Následující powershell skript JENOM VYPÍŠE uživatele, kteří spadají do pravidla 90 dní bez přihlášení, ale nic nesmaže a ve výpisu nebudou uživatelé, které nechcete smazat

Tento skript můžete spustit naprosto bezpečně bez obav, že by vám něco zničil, smazal, nebo rozbil.

# Definování data před 90 dny
$90DaysAgo = (Get-Date).AddDays(-90)

# Seznam účtů, které se nesmějí smazat
$excludedUsers = @("UzivatelCoNechciSmazat", "TohotoTakyNemazat", "nesmazatelnyFranta", "NesmazatelnyHonza", "NesmazatelnyAdmin", "NesmazatelnyTestovaciUcet", "DoNoTDeleteThisJoeUser")

# Získání seznamu uživatelských profilů
$userProfiles = Get-WmiObject -Class Win32_UserProfile

foreach ($profile in $userProfiles) {
    # Kontrola, zda je poslední použití definováno a vytvoření datového objektu
    if (-not [string]::IsNullOrEmpty($profile.LastUseTime)) {
        # Převod LastUseTime na datum
        $lastLogon = ([wmi]"").ConvertToDateTime($profile.LastUseTime)

        # Podmínka pro smazání (poslední přihlášení před 90 dny a ne patří k vynechaným účtům)
        if ($lastLogon -lt $90DaysAgo -and $excludedUsers -notcontains [System.IO.Path]::GetFileNameWithoutExtension($profile.LocalPath)) {
            Write-Host "Profil určený ke smazání: $($profile.LocalPath) (Poslední přihlášení: $lastLogon)"
        }
    }
}

Ukázka výstupu skriptu

Skript pro smazání uživatelů

Pozor! Následující skript oproti předchozímu již maže uživatelské profily. Takže používejte s opatrností a tento článek nebere žádnou zodpovědnost ani záruky za smazaná data, která jste smazat nechtěli.

# Definování data před 90 dny
$90DaysAgo = (Get-Date).AddDays(-90)

# Seznam účtů, které se nesmějí smazat
$excludedUsers = @("Uzivatel", "TohotoTakyNemazat", "nesmazatelnyFranta", "NesmazatelnyHonza", "admin", "test", "DoNOTdeleteThisUserName")

# Získání seznamu uživatelských profilů
$userProfiles = Get-WmiObject -Class Win32_UserProfile

foreach ($profile in $userProfiles) {
    # Kontrola, zda je poslední použití definováno a vytvoření datového objektu
    if (-not [string]::IsNullOrEmpty($profile.LastUseTime)) {
        # Převod LastUseTime na datum
        $lastLogon = ([wmi]"").ConvertToDateTime($profile.LastUseTime)

        # Podmínka pro smazání (poslední přihlášení před 90 dny a ne patří k vynechaným účtům)
        if ($lastLogon -lt $90DaysAgo -and $excludedUsers -notcontains [System.IO.Path]::GetFileNameWithoutExtension($profile.LocalPath)) {
            Write-Host "Profil určený ke smazání: $($profile.LocalPath) (Poslední přihlášení: $lastLogon)"

            # Smazání profilu
            if ($profile.Special -eq $false) {  # Nezabíráme speciální profily, jako jsou uživatelé systému
                $profile.Delete()
                Write-Host "Profil smazán: $($profile.LocalPath)"
            }
        }
    }
}

Chci skript spustit lokálně a přesvědčit se co dělá na jednom počítači, než to pustím všude hromadně

klikněte na start / napište powershell / vpravo klikněte na spustit jako správce

klikněte na start / napište powershell / vpravo klikněte na spustit jako správce
Zde už vidíme powershell ISE, ve kterém stačí copy pastnout zdrojový kód z této stránky a dát spustit. Ty modré výstupy, které jsem vložil nahoře, tak to je výstup z tohoto powershell skriptu.

Pro koho jsou tyto skripty vhodné

Např. pro adminy menších firem, či školní administrátory, kde z nějakého důvodu nemohou použít group policy z domény, protože mají specifické požadavky na nějaké uživatele, které tam potřebují mít ( i přes inaktivitu delší, než 90 dní) a současně to potřebují mít jen např. na specifické skupiny počítačů, které nemusí být součástí stejné OU (organisational unit) v Active Directory a přesouvání počítačů napříč OU by jim z nějakého důvodu způsobilo víc problémů, než užitku. Skript je spustitelný i na jednotlivých počítačích odděleně.

Počítač bez starostí

Pokud jste v situaci, kdy to nemůžete řešit z nějakého důvodu přes group policy na doméně, tak je vaší cestou vložit tento skript někam na disk a volat ho např. při zapínání windows 1x týdně přes Windows Scheduler. (ekvivalent linuxáckého crontabu).

Avatar

By mirra

Hardwaru a počítačům se věnuji již od roku 2003. Za tu dobu jsem poskládal stovky počítačů, opravil tisíce počítačů a vyřešil nespočetně problémů, vad a chyb, se kterými se setkávali uživatelé. Od roku 2005 se zabývám servery, zejména těmi herními, v roce 2007 jsem se začal věnovat Valve Source SDK level designu, který šel od roku 2009 k ledu kvůli studiu Informatiky na univerzitě. Podílel jsem se chvíli i na provozu síťové laboratoře MENDELU, dnes spravuji v jedné osobě cca 100 serverů/diskových polí na univerzitě, řeším IT v malých a středních firmách tak, aby firmy ušetřily nemalé částky při zlepšení kvality a soustředím se na snižování nákladů na IT od licencí až po hardware, software, provádím konsolidace a audity platnosti licencí, které firmám šetří rovněž nemalé peníze. Z velkých firem jsem měl příležitost s dalšími kolegy řešit správu 8000 serverů po celé západní Evropě s vysokou mírou automatizace a poznávání nejrůznějších evropských pracovních mentalit. Dále jsem řešil hybridní cloud ve velké firmě, orientované na trhy střední a východní Evropy. Posledních několik let se věnuji Devops pro velké zákazníky v Azure cloudu, spravuji kubernetes (AKS), Gitlab.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *