Potřebovali jste
někdy zobrazovat uživatelům intranetové aplikace funkcionalitu omezenou podle
jejich příslušnosti do určité skupiny (manager, editor, lopata)? Zkoušeli jste
to někdy dělat pomocí Active Directory? Jde to docela snadno.
Co je to vlastně to Active Directory?
Active Directory
je implementace adresářových služeb LDAP firmou Microsoft pro použití v
prostředí systému Microsoft Windows. Active Directory umožňuje administrátorům
nastavovat politiku, instalovat programy na mnoho počítačů nebo aplikovat
kritické aktualizace v celé organizační struktuře. Active Directory ukládá své
informace a nastavení v centrální organizované databázi.
Adresářová služba
Active Directory je rozšiřitelná a škálovatelná adresářová služba, která
umožňuje efektivně uspořádat síťové prostředky.
- vyžaduje instalaci služby DNS
- je založena na standardních internetových protokolech
- jednoznačně definuje strukturu sítě
- organizuje skupiny počítačů a domén
LDAP (Lightweight
Directory Access Protocol) je definovaný protokol pro ukládání a přístup k
datům na adresářovém serveru. Podle tohoto protokolu jsou jednotlivé položky na
serveru ukládány formou záznamů a uspořádány do stromové struktury (jako ve
skutečné adresářové architektuře). Je vhodný pro udržování adresářů a práci s
informacemi o uživatelích (např. pro vyhledávání adres konkrétních uživatelů v
příslušných adresářích, resp. databázích).
Více detailů
naleznete na Wiki (viz [1] a [2]), odkud jsem si také vypůjčil výše uvedené
definice.
V tomto článku se
nebudeme podrobně zabývat všemi možnostmi Active Directiry, ale zaměříme se jen
na informace o uživatelích.
Co se dá z Active Directory zjistit o uživatelích?
No, skoro
všechno. Nejzajímavější atributy jsou tyto:
-
jak
se uživatel jmenuje (displayname)
- jaké
má uživatelské jméno (userprincipalname)
- jakou
má emailovou adresu (mail)
- jaký
má pracovní telefon (mobile)
- kterého
odboru je členem (department)
- kdo
je jeho nadřízeným (manager)
- do
kterých skupin patří (memberof
- a
další volitelné atributy (extensionattributeX); každá organizace může definovat
své vlastní
Jak se Active Directory dotazovat?
Špinavou práci za
nás už naštěstí odvedl Microsoft. Objekty pro práci s Active Directory
implementovány v rámci .NET Frameworku v namespace System.DirectoryServices.
Nejvíce nás bude
zajímat třída DirectorySearcher, která v Active Directory vyhledává. Této
třídě nejprve musíme říct, co a kde chceme vyhledat.
Co chceme najít,
specifikujeme pomocí nastavení filtru. Jedná se v podstatě o jinak zapsanou
WHERE podmínku, kterou používáme pro dotazování do databází (v tomto případě
hierarchické databáze). Dotaz na nalezení konkrétního uživatele může vypadat
takto:
(&(objectCategory=user)(userPrincipalName=karel.ctvrty@domain.net))
Kde chceme
hledat, je vhodné určit co možná nejpřesněji. Čím přesnější cesta, tím kratší
doba vyhledávání a lepší výsledky. Cesta (Path) je zadávaná v notaci
uvedené např. v [5]. Pokud
chceme hledat ve všech uživatelích v doméně, můžeme cestu definovat jako „LDAP://DOMAINNAME“.
A nyní prakticky...
K článku jsou
přiloženy dva projekty.
ActiveDirQuery –
rozšířené [3]
- vyhledávání
uživatelů, počítačů a tiskáren podle jejich jména (uživatelů podle přijmení)
- implementováno
jako WinForm aplikace
ActiveDirListing
- vypsání
všech dostupných atributů právě přihlášeného uživatele
- implementováno
jako ASP.NET aplikace
- aplikace
musí mít aktivovanou authentikaci „Windows Authentication“ a zakázanou
„Anonymous Authentication“
- správci
IIS 7 musí komponentu „Windows Authentication“ ručně doinstalovat, protože
v základní instalaci není obsažena
- „Windows
Authentication“ funguje pouze v kombinaci s Internet Explorerem
Hmm, a odpověď na
úvodní otázku? Jak teda vlastně zjistím, do kterých skupin patří aktuálně
přihlášený uživatel? Nejsme v mateřské školce, proto si kód musíte
vytvořit sami. K řešení můžete použít následující kousky:
-
zjištění
aktuálně přihlášeného uživatele – ActiveDirQuery.
- formulace
Active Directory filtru – tamtéž
- příslušnost
ke skupině v Active Directory – pomocí atributu „memberof“, implementace je
v [4]
Závěrem
Active Directory
je mocným nástrojem, zejména pokud chceme nahlížet do organizačních struktur.
Dá nám odpovědi na mnoho otázek a jeho využíváním se vyhneme duplicitním
definicím skutečností, které jsou již definovány jinde.
Nicméně nic se
nemá přehánět a složitější dotazy do Active Directory mohou naši aplikaci
citelně brzdit (viz diskuse v rámci [4]). Proto je pro náročnější aplikace vhodné zvážit,
zdali není vhodnější místo přímých dotazů do Active Directory stáhnout každou
noc aktuální stav věcí, které nás zajímají a dotazovat se raději našich
vlastních databázových struktur.
Zdroje
[1] http://cs.wikipedia.org/wiki/Active_Directory
[2] http://cs.wikipedia.org/wiki/LDAP
[3] Sriram Chitturi - Querying Active Directory using .NET
classes and LDAP queries
http://www.codeproject.com/KB/system/activedirquery.aspx
[4] silentthread - Check if user is a
member of an Active Directory Group
http://www.vbforums.com/showthread.php?t=415856
[5] LDAP
Pathnames - Distinguished Names
http://www.selfadsi.org/ldap-path.htm