Zobrazují se příspěvky se štítkemAD. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemAD. Zobrazit všechny příspěvky

středa 19. srpna 2009

AD: Přidání uživatelů do skupiny

O práci s Active Directory jsem toho zde zatím moc nepsal. Vzhledem k tomu, že poslední dobou dělám malinko pořádek ve skupinách, příspěvky budou zřejmě častější. Za posledních pár dní jsem narazil na dvě věci, se kterými se můžete potkat.

První z nich je zjišťení FSMO rolí. Pokud s AD pracujete častěji určitě znáte příkaz netdom query fsmo. Stejné informace zjistíte pomocí následujících příkazů PowerShellu:
PS C:\> [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest() | fl *RoleOwner

SchemaRoleOwner : server1.domena.net
NamingRoleOwner : server1.domena.net

PS C:\> [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() | fl *RoleOwner

PdcRoleOwner : server2.sub.domena.net
RidRoleOwner : server2.sub.domena.net
InfrastructureRoleOwner : server2.sub.domena.net

Pro přehlednější výpis si můžete předchozí příkazy zabalit do funkce, ale to už je pouze otázka vkusu (a šetření času).
Druhou věcí, se kterou jsem se potkal, je kopie členů skupiny do jiné skupiny. Opět existuje několik cest, jak to udělat (např. pomocí ds* příkazů), ale v tuto chvíli vidím PowerShell jako lepší řešení. Já se ještě rozhodl zadání trochu upravit, taže výsledkem bylo: Vzít všechny členy skupiny users.all, vybrat pouze účty, které jsou enabled a přidat je do skupiny users.all.new.
Tři úkoly, tři cmdlety, dvě roury.
PS C:\> Get-QADGroupMember 'users.all' | Get-QADUser -Enabled | Add-QADGroupMember 'users.all.new'

Edit: Poté, co jsem se přepl na počítač s nejnovější verzi cmdletů od Questu zjistil jsem, že přidali nový parametr pro Get-QADUser. Správně by tedy mohlo být i toto (celá akce je pak o mnoho rychlejší - na mém počítači 12x):
PS C:\> Get-QADUser -MemberOf 'users.all' -Enabled | Add-QADGroupMember 'users.all.new'

Použité cmdlety nejsou standardní součástí PowerShellu, ale dají se zdarma stáhnout z webu firmy Quest Software.

pátek 19. června 2009

Audit skupin v Active Directory

Dnes mě na chatu chytil jeden z přátel zabývajících se bezpečností. Líbil se mu report zobrazující lokální administrátory na koncových stanicích a chtěl něco podobného vytvořit pro skupinu Domain Admins. Ptal se mne na možnosti a mou první odpovědí bylo: PowerShell.

První nástřel byl tento:
Get-QADGroupMember 'domain.com/CZ/Domain Admins'

Výstupem příkazu je seznam členů této skupiny. To mělo úspěch a samozřejmě přišla další otázka: "Lze porovnat výsledky proti nějakému danému stavu?" Ano, úkol jak dělaný pro Compare-Object. Celý skript pak vypadal následovně.
  1. function Compare-ADGroup {
  2. param (
  3. [string]$group = 'domain.com/CZ/Domain Admins',
  4. [switch]$snapshot
  5. )
  6. if ($snapshot) {
  7. # save state as snapshot
  8. Get-QADGroupMember $group | `
  9. Select-Object SamAccountName, FirstName, LastName | `
  10. Export-Clixml ./snapshot.xml
  11. }
  12. else {
  13. Get-QADGroupMember $group | `
  14. Select-Object SamAccountName, FirstName, LastName | `
  15. Export-Clixml ./current.xml
  16. # load to variables, sort to prepare for Compare-Object
  17. $s = (Import-Clixml ./snapshot.xml) | Sort-Object SamAccountName
  18. $c = (Import-Clixml ./current.xml) | Sort-Object SamAccountName
  19. # compare objects based on SamAccountName
  20. Compare-Object -ReferenceObject $s -DifferenceObject $c -Property SamAccountName
  21. } # else
  22. } # function Compare-ADGroup
První spuštění musí být s parametrem -Snapshot. Tím se vytvoří referenční soubor se "správnými" daty. Skript by šel ještě vylepšit o kontrolu existence souboru snapshot.xml nebo například o vložení časové značky do souboru current.xml.

čtvrtek 14. května 2009

Hej, mistře Šelíku!

Vítejte zpátky u mistra Šelíka. V posledním TechNet Flash zpravodaji řešil následující problém.

No, dejme tomu - DateDiff je dobrá funkce, ale kdo si má pamatovat, kdy si naposledy měnil heslo. DateDiff (resp. odčítání dvou dat) bych použil v případě, že bych chtěl například zjistit, kolik dní zbývá do Vánoc.

PS C:\> $vanoce = '2009/12/24'
PS C:\> ($vanoce - (get-date)).Days
223

V případě zjištění délky používání hesla je lepší sáhnout přes ADSI na vlastnost PasswordAge.

PS C:\> [ADSI]$user="WinNT://czvm01/administrator,user"
PS C:\> $user.PasswordAge
97399082
PS C:\> ($user.PasswordAge).value/86400
1127,30418981481

První výsledek nám vrátil stáří hesla v sekundách, takže jsme jej přepočítali na dny. Vidíme, že administrátorské heslo na tomto počítači nebylo změněno hodně dlouho :) V případě, že by vás zajímalo stáří hesla pro účet v Active Directory, stačí změnit první řádek na následující variantu:

PS C:\> [ADSI]$user="WinNT://domain.name/administrator,user"

a v proměnné $user budeme mít uložen účet doménového administrátora.

Pokud víte, že informaci o stáří hesla budete využívat častěji, můžete si předchozí kód uložit do skriptu.

function Get-PasswordAge {

param (
[string]$scope = "$env:computername",
[string]$user = "administrator"
)

[ADSI]$ADSIobj="WinNT://$scope/$user,user"
"$user : $([Math]::Round(($ADSIobj.PasswordAge).value/86400))"
}

PS C:\> Get-PasswordAge
1127
PS C:\> Get-PasswordAge -user $env:USERNAME -scope $env:USERDOMAIN
86

Jediným doplněním je závěrečné zaokrouhlení dnů na celá čísla pro lepší přehlednost.

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.