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
- Uživatelé (user account) - vytváření a nastavování hodnot
- Uživatelé (user account) - výpis účtů a hodnot
- Skupiny (group)
- Počítače (computer account) - výpis účtů a hodnot
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
Fungovat bude ovsem jenom lidem se zapnutou sluzbou Active Directory Web Services, jinac maji smolika stejne jako ja
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.
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" }
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?
odpověď na [4]roman: Zadejte to na řádky, jak je uvedeno v článku. Tzn. Get-ADGroupMember musí začínat na novém řádku.
Mezi .count a write-host ti chybí středník.
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ší.
Aha, jasně, omlouvám se...
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?
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.
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!
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
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!
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
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
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..
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
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é.
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.
Dobrý den, jaký je správný postup pro změnu computername vzdáleného PC na síti v AD pomocí PS. Děkuji
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
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/
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é.
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