Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Titulní Blogy Fotky Soubory

Greenyho pracovní zápisníček

Tento blog vznikl jako vedlejší produkt během mé práce na různých projektech pro společnost Adastra CZ. Blog není koncipován jako pravidelná rubrika. Budu sem zveřejňovat zajímavé věci, na které během svého zápasu se světem .NETu narazím. Doufám, že vám tím váš vlastní zápas učiním o trochu lehčí.

Dotazování Active Directory

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

Zveřejněno 6. prosince 2009 11:48 by daniel.smolka
Vedeno pod: , , ,

Attachment(s): adquery-example.zip

Komentář

Žádné komentáře
Neregistrovaní uživatele nemužou přidávat komentáře.
Powered by Community Server (Personal Edition), by Telligent Systems
Vyvojar.cz na prodej!