www.SAMURAJ-cz.com 

27.04.2024 Jaroslav Translate to English by Google     VÍTEJTE V MÉM SVĚTĚ

Články

Vzdálená změna hesla lokálních uživatelů Windows

Pátek, 12.02.2016 11:22 | Samuraj - Petr Bouška |
Zmíníme si pár možností, jak konfigurovat lokální uživatelské účtu z příkazové řádky (pomocí skriptu). Jako hlavní účel je hromadná změna lokálních účtů na různých počítačích v prostředí (Active Directory) sítě. Článek uvádí různé konfigurační možnosti a na závěr příklad hromadné změny hesel lokálních uživatelů. Nejde o detailně dotažený skript, každý si jej může dotvořit dle svých potřeb.

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
zobrazeno: 22328krát | Komentáře [4]

Autor:

Související články:

Windows OS

Články, které se věnují operačním systémům firmy Microsoft, jak klientských, tak serverových.

PowerShell

Články týkající se Microsoft skriptovacího jazyku PowerShell, který se používá ve všech nových verzích MS OS a aplikací.

Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže.

Komentáře

  1. [1] Karel

    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í?

    Středa, 13.04.2016 11:39 | odpovědět
  2. [2] Michal_F

    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 :)

    Pondělí, 09.05.2016 15:03 | odpovědět
  3. [3] Lada_H

    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 :-)

    Středa, 30.11.2016 18:24 | odpovědět
  4. [4] Pete

    tohle je docela funkční LAPS https://technet.microsoft.com/en-us/mt227395.aspx

    Středa, 14.02.2018 00:00 | odpovědět
Přidat komentář

Vložit tag: strong em link

Vložit smajlík: :-) ;-) :-( :-O

Nápověda:
  • maximální délka komentáře je 2000 znaků
  • HTML tagy nejsou povoleny (budou odstraněny), použít se mohou pouze speciální tagy (jsou uvedeny nad vstupním polem)
  • nový řádek (ENTER) ukončí odstavec a začne nový
  • pokud odpovídáte na jiný komentář, vložte na začátek odstavce (řádku) číslo komentáře v hranatých závorkách