Group Policy Preferences a změna hesel
Když se objevily Group Policy Preferences (můj popis Group Policy Preferences, GPO, GPMC, GPME), tak obsahovaly zajímavou možnost ovládání lokálních uživatelských účtů, včetně změny hesla. Bohužel po pár letech Microsoft zjistil, že uložené heslo v této politice není bezpečné. Místo, aby situaci vyřešil, tak zablokoval ukládání hesel (atribut CPassword) a tedy řadu možností včetně změny hesla. Oficiální doporučení je použít pro tento účel nějaká centrální skript, který vzdáleně změní hesla. Popis problému je v MS14-025: Vulnerability in Group Policy Preferences could allow elevation of privilege: May 13, 2014.
Využití příkazu Net user pro správu uživatelů
Lokálně na počítači můžeme využít nástroj pro příkazovou řádku net user, popis Net user is a command. Nabízí širokou škálu možností.
Můžeme provést nastavení (změnu) hesla:
net user uživatel heslo
Ale také řadu dalších věcí, jako vytvoření účtu, disablování, nastavení expirace účtu.
net user /add uživatel heslo net user uživatel /ACTIVE:NO net user uživatel /expire:Never net user uzivatel /expire:1.10.2016
Můžeme pracovat nejen s lokálními, ale i s doménovými účty. Příklad získání informací o doménovém účtu:
net user uživatel /domain
Pokud bychom chtěli přejmenovat účet, tak musíme využít jiný příkaz:
wmic useraccount where name=currentname rename newname
Toto jsou volání, která můžeme provádět lokálně. Pokud se ale vzdáleně připojíme k nějakému počítači (třeba pomocí PowerShell session), tak můžeme využít i tyto příkazy (vzdáleně volat lokální příkazy).
Nástroj pro vzdálenou změnu hesla PsPassword
Aplikace PsPasswd (PsPasswd - TechNet) z populární skupiny Windows Sysinternals, přináší pohodlnou možnost vzdálené změny hesla. Příklad změny hesla, pokud spouštíme pod uživatelem, který má oprávnění na vzdálenou stanici:
pspasswd \\počítač uživatel heslo
Využití PowerShellu pro správu účtů
Bohužel PowerShell sám o sobě nemá žádné příkazy pro správu lokálních uživatelských účtů a hesel. Můžeme ale využít ADSI adaptér a .NET třídy a využít tak (trochu více programátorské) široké možnosti ovládání.
Nejprve vždy vytvoříme reprezentaci objektu, kde určíme kam a k jakému typu se připojujeme. Třeba uživatel User na počítači Stanice:
$user = [adsi]"WinNT://stanice/administrator, user"
Následně využíváme různé metody a vlastnosti objektu. Třeba metoda SetPassword pro nastavení hesla:
$user.SetPassword("Heslo")
Někdy můžeme provést volání přímo, jak je uvedeno výše. Někdy musíme využít trochu složitější zápis:
$user.psbase.Invoke("SetPassword", "Heslo")
Příklady operací nad uživatelskými účty pomocí PowerShell ADSI adapter
Přejmenování uživatele administrator na admin na počítači stanice.
$user = [adsi]"WinNT://stanice/administrator, user" $user.Rename("admin")
Změna hesla uživatele admin na počítači stanice.
$user = [adsi]"WinNT://stanice/admin, user" $user.SetPassword("Heslo")
Disablování účtu admin na počítači stanice.
$user = [adsi]"WinNT://stanice/admin, user" $user.AccountDisabled = $true $user.SetInfo()
Vytvoření účtu admin na počítači stanice.
$comp = [adsi]"WinNT://stanice" $user = $comp.Create("User", "Admin") $user.SetPassword("heslo") $user.SetInfo()
Smazání účtu admin na počítači stanice.
$comp = [adsi]"WinNT://stanice" $comp.Delete("User", "Admin")
Zařazení uživatele admin do skupiny lokálních administrátorů Administrators na počítači stanice.
$user = [adsi]"WinNT://stanice/admin, user" $group = [adsi]"WinNT://stanice/Administrators, group" $group.Add($user.path)
Seznam lokálních uživatelů na počítači stanice.
$users = ([adsi]"WinNT://$computer").Children | where {$_.SchemaClassName -eq 'user'} $users.Name
Seznam členů skupiny Administrators na počítači stanice.
$group = [adsi]"WinNT://stanice/Administrators, group" $group.psbase.invoke("members") | ForEach { $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) }
Je uživatel Admin členem skupiny Administrators na počítači stanice?
$group = [adsi]"WinNT://stanice/Administrators, group" $isMember = $false $group.psbase.invoke("members") | ForEach { if(($_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)).Equals("Admin")) { $isMember = $true; } } $isMember
Změna uživatelského hesla na skupině vzdálených počítačů
Pomocí PowerShellu můžeme provést libovolnou změnu hromadně. Například uložíme seznam jmen počítačů do textového souboru (na každý řádek jedno jméno), ten načteme a ve smyčce voláme. Případně s nějakým bezpečnějším zadáním hesla, aby nebylo uloženo ve skriptu.
$username = "Emil" $passwd = "Heslo" $computers = Get-Content -path C:\computers.txt Foreach($computer in $computers) { $user = [adsi]"WinNT://$computer/$username, user" $user.SetPassword($passwd) }
Podobně můžeme vzít seznam počítačů z nějakého kontejneru v Active Directory, což je ještě pohodlnější.
$username = "Emil" $passwd = "Heslo" $OU = "OU=Počítače,DC=firma,DC=local" Get-ADComputer -Filter * -SearchBase $OU | ForEach-Object { $computer = $_.Name if(Test-Connection -ComputerName $_.Name -Count 1 -Quiet) { "Měním heslo na počítači " + $computer + " pro uživatele " + $username $user = [adsi]"WinNT://$_.Name/$username, user" $user.SetPassword($passwd) } }
Se skriptem si můžeme různě vyhrát a vylepšit jej (provádět různé kontroly, reakce na chyby, více operací než změnu hesla, atd). Zde již přidám pouze poznámku, že si můžeme výstup ukládat do souboru. Možností je více, jedna je, že na začátek skritpu přidáme
Start-Transcript -path C:\output.txt
A na konec.
Stop-Transcript
Díky za pěkný článek.
U toho PsPassword je bohužel škoda že v poslední verzi 1.23 (staré několik let) je nějaký bug a nefungují korektně přepínače -u a -p což činí tento příkaz nepoužitelným (na místo vykonání příkazu se zobrazí pouze výpis syntaxe).
Předchozí verze 1.22 funguje korektně ale bohužel se nedá stáhnout z oficiálních stránek a stahovat ji jinde je potenciálně nebezpečné... mimochodem nemáte ji někdo nebo alespoň hash pro ověření pravosti?
Používáte někdo tento způsob změny hesla (PsPasswd) v ostrém prostředí?
Zdravicko, chcem len poukazat na super riesenie priamo od Microsoftu s nazvom LAPS (Local Administrator Password Management). Je celkom zaujimava novinka, ale osobne nemam skusenosti s nasadenim. Kedze kazdenmu pc generuje ine a nahodne heslo, plus sa pravidelne meni je to podla mna minimalne o uroven lepsie riesenie :)
odpověď na [2]Michal_F: když mi dátě na vás email tak vám pošlu dokumentaci, podle které jsem toto řešení před víc jak rokem nasazoval u nás
tohle je docela funkční LAPS https://technet.microsoft.com/en-us/mt227395.aspx