Aki valaha is foglalkozott már az Active Directory-val az tudja, hogy a címtár felépítése gyökeresen eltér egy relációs adatbázis szerkezetétől. Nem elég, hogy az egyes elemek konténerekben helyezkednek el, melyek hierarchikus kapcsolatban állnak egymással, de egy konténeren belül teljesen különböző tulajdonságokkal bíró címtár objektumok is lehetnek. És mégis, van lehetőség arra, hogy az SQL Servernek megtanítsuk, hogyan kell lekérdezni a címtárat. Perverzek előnyben :)
A megoldás kulcsa, hogy az SQL Server képes ún. linked servereket kezelni, ami gyakorlatilag bármilyen OLE DB adatforrás lehet. Íme egy ábra a Books Online-ból, akit a szöveg is érdekel, itt olvasson tovább:
.gif)
T-SQL-ben mindez így történik:
EXEC sp_addlinkedserver
@server = N'ADSI',
@srvproduct = N'Active Directory Service Interfaces',
@provider = N'ADSDSOObject',
@datasrc = N'adsdatasource'
GO
Az sp_addlinkedserver dokumentációjában egy rakás adatforrásról találunk leírást, de az ADsDSOObject valahogy kimaradt. Ennek valószínűleg az az oka, hogy nincs sok köze az SQL Serverhez, az ADsDSOObject ugyanis Windows 2000-től kezdve az Active Directory Service Interfaces (ADSI) OLE DB Provider, amit már az ADO is ismert sok más providerrel együtt.
Persze kell egy felhasználó, akinek a nevében az SQL Server olvashatja a címtárat:
EXEC sp_addlinkedsrvlogin
@rmtsrvname = N'ADSI',
@useself = N'False',
@rmtuser = N'TARTOMANY\felhasznalo',
@rmtpassword = N'T1tk0sJel520!'
GO
Persze aki inkább kattintgatni szeret, ugyanezeket beállíthatja SQL Server Management Studioban is: a Server Object ág alatt található Linked Servers ágnál érdemes körülnézni:
Az így létrehozott linked serveren az OPENQUERY utasítással futtathatunk lekérdezéseket. Hogy ezzel ne kelljen mindig küzdeni, én inkább létrehoztam egy nézetet (ahogy Eriktől megtanultam, a tempdb kiváló játszótér erre a célra):
CREATE VIEW [dbo].[vw_MyGroup]
AS
SELECT
sAMAccountName AS [Login Name],
givenName AS [First Name],
sn AS [Last Name],
displayName AS [Full Name],
mail AS [E-Mail Address],
telephoneNumber AS [Phone]
FROM
OPENQUERY( ADSI,
'SELECT sAMAccountName, givenName, sn, displayName, mail, telephoneNumber
FROM ''LDAP://demodc.demodom.local''
WHERE objectClass = ''user'' AND
memberOf = ''CN=MyGroup,CN=Users,dc=demodom,dc=local'' ' )
AS t
GO
A memberOf attribútum lekérdezésével azt sikerült megadni, hogy csak azokat a felhasználókat kapjuk meg, akik tagjai a MyGroup nevű csoportnak. Persze ezeknek a kacifántos LDAP útvonalaknak a megírása okozhat még némi nehézséget, de abban az ADSI Edit nevű eszköz sokat segíthet. Ugyanezzel az eszközzel az objektumok attribútumai között is mazsolázhatunk.
Lehet ám még fokozni a képet, például SharePoint bevonásával. Hogy pontosan hogyan és miért, azt a jövő keddi Megoldásbörzén megmutatom.