Active Directory címkéhez tartozó bejegyzések

COMException: Illegal operation attempted on a registry key

COM is loveA COMException egy igazi klasszikus rémálom. Egyrészt ijesztő (“jajj, mit kezdjünk most ezzel?”), másrészt Champollion legyen a talpán, aki rájön, hogy igazából mi a baj. Persze a második gátlástalanul erősíti az elsőt.

Íme egy példa illusztrációként: adott egy webszerver, rajta egy ASP.NET-es alkalmazás, ami Active Directory-hoz kapcsolódik. A webhely tökéletesen működik, de a szerverre kerül egy másik web application is, ami után a DirectoryEntry konstruktor nem tud a címtárhoz kapcsolódni, helyette inkább elszáll ezzel a hibával:

System.Runtime.InteropServices.COMException (0x800703FA): Illegal operation attempted on a registry key that has been marked for deletion.

Pedig én aztán nem csináltam semmit, sem ezzel az alkalmazással, sem a címtárral, sem a registry-vel! Azért elég zavarba ejtő, az Event Logban persze semmi hasznos, a hibaüzenetben még kevésbé.

Hát akkor rajta, elő a Process Monitorral, az majd megmondja, hogy kinek melyik registry kulccsal van baja –  persze csak miután az ember leszűrte és átnyálazta a sok ezer sornyi logot. Azért előtte egy gyors apppool recycle, hátha… És bejött, azóta semmi baja a szervernek.

COM is not love.

 

Technorati-címkék: ,,

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.