Články
PowerShell - Active Directory
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
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
Související články:
PowerShell
- PowerShell - Active Directory [14.11.2010 13:13] právě čtete
- PowerShell - Exchange server [19.11.2010 08:45]
- PowerShell - Windows [12.12.2010 18:00]
- PowerShell - Ovládání aplikací a další použití [09.01.2011 18:59]
- Exchange Web Services a PowerShell [13.01.2011 11:00]
- Active Directory Recycle Bin [31.03.2011 15:48]
- Automatizovaná kontrola prostředí pomocí PowerShellu [13.06.2011 17:35]
- Powershell - poslední přihlášení počítače či uživatele [06.09.2011 14:44]
- Exchange Server, Outlook a certifikáty v GALu [27.12.2011 14:48]
Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže. Pokud chcete poradit s nějakým problémem či diskutovat na nějaké téma, tak použijte fórum.

Komentáře
Fungovat bude ovsem jenom lidem se zapnutou sluzbou Active Directory Web Services, jinac maji smolika stejne jako ja