www.SAMURAJ-cz.com 

23.04.2024 Vojtěch Translate to English by Google     VÍTEJTE V MÉM SVĚTĚ

Články

PowerShell - Active Directory

Neděle, 14.11.2010 13:13 | Samuraj - Petr Bouška |
Tak už i na mne dolehl PowerShell, ne že bych se mu bránil, ale hodně věcí udělám radši v GUI. Pro různé hromadné úpravy či výpisy určitých hodnot, se jedná o velice užitečného pomocníka. Myslím ale, že PowerShell není vytvořen zrovna User Friendly, takže pokud něco nepoužíváme pravidelně, není možné si to zapamatovat (neobsahuje takovou jednoduchou a chytrou nápovědu jako Cisco IOS). Proto jsem začal vytvářen tento seznam užitečných příkazů (a jejich variací), abych měl v případě potřeby, kam nahlédnout.

Na hodně věcí můžeme použít Active Directory Users and Computers (ADUC), a v něm třeba Queries, nebo nový Active Directory Administrative Center. PowerShell a modul ActiveDirectory toho však umí více, můžeme některé operace skriptovat, a také dostaneme výsledky, s kterými můžeme dále pracovat (třeba v Excelu). Pokud používám PowerShell přímo, tak nejraději z PowerShell ISE, které je součástí Windows 7.

Abychom mohli použít ActiveDirectory modul na stanici, tak musíme mít nainstalovaný Active Directory Domain Services (AD DS and AD LDS Tools, což je součást RSAT - Remote Server Administration Tools) a v něm povolenu vlastnost Active Directory Module for Windows PowerShell. Také musíme být alespoň na jednom doménovém řadiči nainstalovaná služba Windows Server 2008 R2 Active Directory Web Services.

Obecné vlastnosti

Použití AD příkazů

Pokud použijeme PowerShell ISE, tak po každém spuštění musíme nejprve importovat modul ActiveDirectory, abychom měli k dispozici příkazy pro Active Directory.

Import-Module ActiveDirectory

Procházení Active Directory

AD můžeme procházet stejně, jako souborový systém. Nejprve se přepneme do AD a pak používáme příkazy dir, cd apod.

PS C:\> cd ad:
PS AD:\> dir

Name                 ObjectClass          DistinguishedName
----                 -----------          -----------------
firma                domainDNS            DC=firma,DC=local
Configuration        configuration        CN=Configuration,...
Schema               dMD                  CN=Schema,CN=Conf...
ForestDnsZones       domainDNS            DC=ForestDnsZones...
DomainDnsZones       domainDNS            DC=DomainDnsZones...

PS AD:\> cd 'DC=firma,DC=local'
PS AD:\DC=firma,DC=local>

Informace o aktuální doméně

Get-ADDomain

Informace o doménových řadičích

$dc = Get-ADDomainController -Filter *
$dc | FT Name,Site,OperationMasterRoles,OperatingSystem,IsGlobalCatalog -AutoSize 

Uživatelé (user account) - vytváření a nastavování hodnot

Založení uživatele

Pokud máme Exchange server, tak se nám spíš hodí použít příkaz, který vytvoří zároveň účet i mailbox. Uživatele vytvoříme s defaultním heslem 123456 a určujeme kontejner, v kterém se účet vytvoří.

$pass = ConvertTo-SecureString -AsPlainText -Force -String '123456' 
New-ADUser bouska -Name 'Bouška Petr' -SamAccountName 'bouska' -Path 'ou=Firma,dc=firma,dc=local' -UserPrincipalName 'bouska@firma.local' -GivenName 'Petr' -Surname 'Bouška' -AcountPassword $pass -Enabled $true

Nastavení uživatelům, že musí při příštím přihlášení změnit heslo

Aby šlo nastavit ChangePasswordAtLogon, tak nesmí být nastaveno PasswordNeverExpires.

Get-ADUser -Filter * -SearchBase "OU=Firma,DC=firma,DC=local" | Set-ADUser -PasswordNeverExpires $false
Get-ADUser -Filter * -SearchBase "OU=Firma,DC=firma,DC=local" | Set-ADUser -ChangePasswordAtLogon $true 

Uživatelé (user account) - výpis účtů a hodnot

Zobrazení všech vlastností uživatele

Get-ADUser bouska -Properties * 

Seznam uživatelů a počet špatně zadaných hesel

Get-ADUser -Filter * -Properties badPwdCount | FT Name,badPwdCount,Enabled

Seznam uživatelů, kteří mají nastaveno ChangePasswordAtLogon

Když chceme zobrazit seznam uživatelů, kteří mají nastaven parametr ChangePasswordAtLogon (to můžeme nastavit pomocí PowerShellu nebo ADUC), tak zjistíme, že žádný takový LDAP atribut neexistuje, takže takové uživatele nemůžeme zobrazit. Ono se totiž děje to, když nastavíme ChangePasswordAtLogon, tak se nastaví parametr pwdLastSet na hodnotu 0 a PasswordExpired na true. Takže uživatele můžeme zobrazit podle jedné z těchto hodnot.

Get-ADUser -Filter {pwdLastSet -eq 0} -Properties pwdLastSet | FT Name

Pro zobrazení podle atributu PasswordExpired by měl fungovat následující příkaz, ale mě v praxi nefunguje filtrování pouze hodnot true. Takže jsem to obešel druhým příkazem, kdy na začátku seznamu jsou hodnoty true.

Get-ADUser -Filter {PasswordExpired -eq $true} -Properties PasswordExpired  | FT Name, PasswordExpired  
Get-ADUser -Filter * -Properties PasswordExpired | Sort-Object PasswordExpired -Descending | FT name,PasswordExpired -AutoSize

Seznam disablovaných uživatelských účtů

Dvě možnosti pomocí různého příkazu.

Get-ADUser -Filter {Enabled -eq $false} | FT name
Search-ADAccount -AccountDisabled -UsersOnly | Sort-Object Name | FT Name,DistinguishedName -AutoSize

Seznam zamčených uživatelských účtů

Search-ADAccount -LockedOut -UsersOnly | Sort-Object Name | FT Name,DistinguishedName -AutoSize

Seznam uživatelů, kteří se nepřihlásili za posledních 30 dní

Search-ADAccount -AccountInactive -TimeSpan "30" -UsersOnly | Sort-Object LastLogonDate | FT Name,LastLogonDate,Enabled,LockedOut,PasswordExpired,DistinguishedName -AutoSize

Skupiny (group)

Seznam skupin, do kterých je zařazen uživatel

Get-ADPrincipalGroupMembership -Identity bouska 

Zařazení uživatele do skupiny

Add-ADPrincipalGroupMembership -Identity bouska -MemberOf 'G Nějaká skupina' 

Seznam uživatelů ve skupině

Get-ADGroupMember -Identity 'skupina 1' | FT name  

Seznam uživatelů a počet skupin, kterých jsou členem

Get-ADUser -Filter * -SearchBase "OU=firma,DC=firma,DC=local" -ResultPageSize 10 | ForEach-Object { 
  $groupc = (Get-ADPrincipalGroupMembership $_.SamAccountName | Measure-Object).Count 
  Write-Host $_.SamAccountName $groupc
}

Výpis skupin dle filtru a seznam jejich členů

Get-ADGroup -Filter { name -like "Group *" } | ForEach-Object { $_.SamAccountName 
   Get-ADGroupMember $_.SamAccountName | ForEach-Object { Write-Host "   " $_.name }
}

Počítače (computer account) - výpis účtů a hodnot

Počítače s OS Windows 7

Get-ADComputer -Filter {OperatingSystem -like "Windows 7*"}  -Properties OperatingSystem, CanonicalName, whenCreated | Sort-Object Name | FT Name, OperatingSystem, CanonicalName, whenCreated -AutoSize

Počítače s disablovaným účtem

Search-ADAccount -ComputersOnly -AccountDisabled | Sort-Object Name | FT Name,DistinguishedName,LastLogonDate -AutoSize

Počítače, které se dlouho nepřihlásili

Buď můžeme požít kolik posledních dní se nepřihlásili, pomocí TimeSpan, nebo od kdy se nepřihlásili, pomocí DateTime. V obou případech mi ale připadá, že datum úplně nesedí, a zobrazují se záznamy o 14 dní starší.

Doplněno. Tato situace je trochu komplikovanější a podrobně jsem ji popsal v článku Powershell - poslední přihlášení počítače či uživatele.

Search-ADAccount -ComputersOnly -AccountInactive -TimeSpan "30" | Sort-Object LastLogonDate | FT Name,LastLogonDate,Enabled,LockedOut -AutoSize
Search-ADAccount -ComputersOnly -AccountInactive -DateTime "1.11.2010" | Sort-Object LastLogonDate | FT Name,LastLogonDate,Enabled,LockedOut -AutoSize

V některých případech můžeme potřebovat zobrazit i jiné hodnoty, tak se může hodit alternativa pomocí Get-ADComputer a filtru.

$logonDate = New-Object System.DateTime(2010,9,19)
Get-ADComputer -Filter { lastLogon -le $logonDate } | FT
Get-ADComputer -Filter { lastLogon -le $logonDate } -Properties LastLogonTimeStamp, OperatingSystem  | Select-Object Name, DistinguishedName , OperatingSystem, LastLogonTimeStamp | Sort-Object Name

Počítače, které si dlouho nezměnili heslo

Počítače, které si změnili heslo naposled před 45 dny. Počítače v doméně si musí pravidelně měnit heslo (defaultně každých 30 dní), pokud tak neučiní, znamená to, že jsou neaktivní.

$lastSetdate = [DateTime]::Now - [TimeSpan]::Parse("45")
Get-ADComputer -Filter {PasswordLastSet -le $lastSetdate} -Properties passwordLastSet -ResultSetSize $null | FT samaccountname,DistinguishedName,PasswordLastSet
zobrazeno: 53382krát | Komentáře [24]

Autor:

Související články:

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

Active Directory a protokol LDAP

Správa počítačové sítě ala Microsoft, to je Active Directory. Jedná se o velice rozsáhlou skupinu technologií a služeb. Základem jsou adresářové služby, adresáře a komunikační protokol LDAP.

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

Komentáře

  1. [1] Krakonos

    Fungovat bude ovsem jenom lidem se zapnutou sluzbou Active Directory Web Services, jinac maji smolika stejne jako ja :-(

    Pondělí, 15.11.2010 15:13 | odpovědět
  2. [2] Vláďa

    Dobrý den, pane Bouška měl bych dotaz, jak je možné najít uživatele dle jeho mobilního čísla v AD?

    Děkuji.

    Čtvrtek, 26.09.2013 14:01 | odpovědět
  3. [3] Samuraj

    odpověď na [2]Vláďa: Nějak jsem tenhle jednoduchý dotaz přehlédl, tak dodatečně. Třeba:

    Get-ADUser -Filter { mobile -eq "+420123456789" }

    Neděle, 13.10.2013 20:20 | odpovědět
  4. [4] roman

    Zdravím po zadání:

    Get-ADGroup -Filter { name -like "Group *" } | ForEach-Object { $_.SamAccountName Get-ADGroupMember $_.SamAccountName | ForEach-Object { Write-Host " " $_.name }}

    se vypíše:

    Unexpected token 'Get-ADGroupMember' in expression or statement.

    At line:1 char:83

    Unexpected token '_' in expression or statement.

    At line:1 char:101

    Unexpected token '.SamAccountName' in expression or statement.

    At line:1 char:103

    An empty pipe element is not allowed.

    At line:1 char:119

    Missing closing '}' in statement block.

    At line:1 char:165

    Můžete poradit, kde je chyba?

    Pátek, 20.06.2014 11:11 | odpovědět
  5. [5] Samuraj

    odpověď na [4]roman: Zadejte to na řádky, jak je uvedeno v článku. Tzn. Get-ADGroupMember musí začínat na novém řádku.

    Pátek, 20.06.2014 11:25 | odpovědět
  6. [6] roman

    Mezi .count a write-host ti chybí středník.

    ;-)

    Pátek, 20.06.2014 12:00 | odpovědět
  7. [7] Samuraj

    odpověď na [6]roman: Nechybí. Jako oddělovač se může použít středník stejně jako nový řádek. Ale v určitých detailech se liší.

    Pátek, 20.06.2014 12:24 | odpovědět
  8. [8] roman

    Aha, jasně, omlouvám se...

    Pátek, 20.06.2014 13:03 | odpovědět
  9. [9] roman

    U Výpis skupin dle filtru a seznam jejich členů mi to vypíše jenom

    Group Policy Creator Owners

    Administrator

    a nic víc?... dají se z toho vymačkat všechny skupiny?

    Pátek, 20.06.2014 14:56 | odpovědět
  10. [10] Samuraj

    odpověď na [9]roman: Proč se to asi jmenuje "dle filtru"? Stačí upravit filtr, teď je tam "Group *", může se dát "*" pro vše.

    Pátek, 20.06.2014 16:07 | odpovědět
  11. [11] roman

    Kamaráde, ty jsi poklad! ;-)

    Díky ti moc a nezlob se za "blbý" dotazy. Dělám s tím první den a taky díky tobě to klaplo!

    Pátek, 20.06.2014 16:22 | odpovědět
  12. [12] hlavi

    Zdravím, je možné nějakým příkazem v PS změnit vybrané, nebo všechny uživatele z Administrátorů na PowerUsery, tedy změnit jejich členství u doménového účtu?

    Děkuji

    Pátek, 29.08.2014 18:05 | odpovědět
  13. [13] Hafajs

    Dobry den,

    marne se snazim zmenit heslo existujícímu uzivakovi. Prikaz Set-ADAccountPassword -Identity uzivatelskejmeno -OldPassword (ConvertTo-SecureString -AsPlainText "textova_hodnota_stareho_hesla" -Force) -NewPassword (ConvertTo-SecureString -AsPlainText "textova_hodnota_noveho_hesla" -Force)

    vraci chybu o neodpovidajicim heslu (to ale odpovida).

    Nemate někdo třeba lepsi napad kudy na to?

    Dik a dik i za clanky!

    Pondělí, 29.09.2014 10:56 | odpovědět
  14. [14] Hafajs

    odpověď na [13]Hafajs:

    Tak si odpovim sam :) spravne zneni je:

    Import-Module ActiveDirectory

    $pass= convertto-securestring -asplaintext -force -string "NoveHeslo123"

    Set-ADAccountPassword bfu.tester -NewPassword $pass

    A diky za reseni patri F. Wofrkovi ;-)

    Čtvrtek, 09.10.2014 13:23 | odpovědět
  15. [15] OD

    Ahoj,

    máš super forum, hlavně ta část s power shell, jen mi tady chybí příklad: vypsání všech group, OU, v AD popř uživatelských účtů. Pokud by si mohl doplnit bylo by to super.

    S pozdravem OD

    Středa, 01.04.2015 13:49 | odpovědět
  16. [16] Lu2

    Dobrý den,

    existuje prosím nějaký příkaz, který zjistí, ke kteremu DC je aktuálně uživatel přiřazen? Pokud si totiž někdo zamkne účet a já ho potřebuji odemknou musím projet u nás např 9 DC než zjistím, kde je a až pak ho můžu odemknout.. Vím, že příkazem "Set lo" mi zobrazí na kterém jsem já, ale pokud mám zamčený účet tak to nezjistím..

    Středa, 06.12.2017 13:16 | odpovědět
  17. [17] Petan

    Dobrý den,

    nemohu přijít na to, jak odfiltrovat určitý kontainery, na příkazu zjištění počítačů s OS Windows 7. Ten příkaz mi ukáže celý AD na síti

    Čtvrtek, 07.12.2017 07:46 | odpovědět
  18. [18] Samuraj

    odpověď na [17]Petan: Get-ADComputer má atribut -SearchBase pro hledání v rámci jednoho OU, ale odfiltrování některých je složité.

    Pondělí, 18.12.2017 16:47 | odpovědět
  19. [19] Samuraj

    odpověď na [16]Lu2: Musím říci, že nevím.

    Sám jsem to nikdy nepotřeboval. Když chci odemknout účet, tak vím v jaké Site je uživatel a jaké jsou tam DC. Na libovolném mohu odemknout účet, protože probíhá real time replikace.

    Pondělí, 18.12.2017 16:53 | odpovědět
  20. [20] Petr

    Dobrý den, jaký je správný postup pro změnu computername vzdáleného PC na síti v AD pomocí PS. Děkuji

    Úterý, 27.03.2018 07:33 | odpovědět
  21. [21] Pavel

    Dobrý den potřeboval bych poradit jestli je možné: Vypsat jména počítačů v doméně a který uživatel je k nim přihlášen nebo byl naposledy přihlášen.

    Asi takto:

    CanonicalName Name_computer Name_User LastLogonDate

    Domena.cz/Kontejner/Computers/Ekonomicke/Ekonom/PC_03 PC_03 Dostálek Aleš 23.11.2017 11:41

    Domena.cz/Kontejnet/Computers/Ekonomicke/Ucetni/PC_08 PC_08 Zemanová JIndra 01.02.2020 12:05

    Děkuji

    Středa, 26.02.2020 11:58 | odpovědět
  22. [22] Samuraj

    odpověď na [21]Pavel: Myslím, že to je velmi komplikované. Protože informaci, že se nějaký uživatelský účet autentizoval na nějakém počítači, máme pouze v security logu.

    To jsem popisoval www.samuraj-cz.com/clanek/auditovani-bezpecnostnich-udalosti-windows-v-domene/

    Sobota, 29.02.2020 12:07 | odpovědět
  23. [23] Pavel

    V dobách AVG Admin jsem s úspěcem vyžíval okně správce byl sloupec s názvem PC a naposledy přihlášeným uživatelem samozřejmě i další údaje o stavu antiviru a podobně.

    Teď by se hodilo na doménových PC s občas střídají uživatelé.

    :-(

    Pondělí, 02.03.2020 15:10 | odpovědět
  24. [24] Nick

    Dobrý den,

    Chci se zeptat jestli je možné udělat script v PowerShell, který by mi přejmenoval více uživatelů v Active Directory a změnil jim ten user logon name do formátu příjmení + 2 první písmena ze jména (momentálně jsou pojmenováni ve formě jméno.příjmení) a aby byl zachován email, tak to stávající jméno.příjmení by se hodilo do Attribute editoru do proxyAddresses ve formě SMTP:jméno.příjmení@doména.cz

    Děkuji

    Úterý, 19.03.2024 10:36 | 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