Active Directory lekérdezése T-SQL-ből

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:

Linked Servers: Client tier, server tier, and database server tier

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'TARTOMANYfelhasznalo', 
        @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:

Linked Servers a Management Studioban

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.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s