none
Jak zapsat do AD přes LDAP záznam z MsSQL

    Dotaz

  • Zdravím, díky místní pomoci (M.Prágl) se mi podařilo nalinkovat AD do MsSQL přes LDAP. Takže záznamy z AD do MsSQL dostanu ale bohužel pouze jako Read Only.

    SELECT * FROM OPENQUERY(ADSI, 'SELECT mail, cn, sn,givenname, homephone,mobile,telephoneNumber, company, manager, streetAddress, postalCode, st, C FROM ''LDAP://ou=Adresar,dc=home,dc=local'' WHERE objectCategory = ''contact''')

    Poradíte mi prosím někdo jak mám naopak záznamy z MsSQL dostat do AD? Abych mohl provádět synchronizaci kontaktů které mám momentálně v databázi MsSQL. Nejlépe přímo z MsSQL. Asi by to šlo i přes Visual Basic, ale s tím si moc nerozumím.

    Moc díky MK

    pátek 6. dubna 2012 7:31

Odpovědi

  • Odladeno:

    Dim objConn, objRS ' pro SQL
    Dim objRoot, objOU, objDomain, objContact, strDNS, strContainer 'pro AD
    
    'kontaty hledame zde - pozor, bude se brutalne mazat!!!
    strContainer = "OU=contacts"
    
    
    Set objRoot = GetObject("LDAP://rootDSE")
    strDNS = objRoot.Get("defaultNamingContext") 
    Set objDomain = GetObject("LDAP://" & strDNS) 
    Set objOU = GetObject("LDAP://"& strContainer & "," & strDNS)
    
    'smazani vsech kontaktu z OU definovane ve strContainer 
    for each objContact in objOU
    	if objContact.Class="contact" then 'pokud je zde neco jineho nez kontakt nesahama na to 
    		ObjOU.delete "contact","CN=" & objContact.cn
    	end if
    next
    
    
    'ted vybagrujeme kontakty z tabulky contacts databaze contacts v lokalnim SQL a nadrbeme je do AD
    Set objConn = CreateObject("ADODB.Connection")
    objConn.Open "Provider=sqloledb;Data Source=(local);Initial Catalog=contacts;Trusted_Connection=yes"
    
    
    Set objRS = CreateObject("ADODB.Recordset")
    objRS.Open "select name, description, email from contacts", objConn
    Do While Not objRS.EOF
    
    	Set objContact = objOU.Create("contact", "cn=" & objRS.Fields("name"))
    	objContact.Put "Description", rtrim(objRS.Fields("description"))
    	objContact.Put "Mail", rtrim(objRS.Fields("email"))
    	objContact.SetInfo
    
    	objRS.movenext
    Loop
    
    

    MP

    pátek 6. dubna 2012 19:55
    Vlastník
  • Proc tam nedas jen:

    if not(IsNull(objRS.Fields("okres"))) then objContact.Put "st", rtrim(objRS.Fields("okres"))

    ?

    MP

    středa 11. dubna 2012 5:43
    Vlastník

Všechny reakce

  • Napr. http://www.computerperformance.co.uk/vbscript/vbscript_contact_create.htm

    csvde / dsadd / dsmod jsi zavrhl? Osobne bych sel cestou minimalniho odporu - ve scriptu spoustenem dejmetomu v noci pomoci DTS/SSIS vysypal kontakty z SQL do textaku a pres csvde je natahl. Predtim je asi smazni pomoci

    dsquery contact OU=Contacts,DC=home,DC=local | dsrm -noprompt

    at nemusis resit aktualizace, mazani atd. Proste smazes a natahnes

    MP




    pátek 6. dubna 2012 8:56
    Vlastník
  • Zdravím, ten odkaz není funkční.

    csvde / dsadd / dsmod jsem úplně nezavrhl. Pouze hledám nejjednodušší řešení.  :o)
    pátek 6. dubna 2012 9:00
  • co na odkazu neni funkcni? Zde funguje. Priklad kodu z nej:

    ' Contact .vbs
    ' Purpose VBScript to create a contact object in Active Directory
    ' Author Guy Thomas http://computerperformance.co.uk/
    ' Version 1.3 - May 2010
    ' -----------------------------------------------' 
    Option Explicit
    Dim objRoot, objOU, objDomain, objContact, strYourDescription
    Dim strDNS, strContainer, strContactName, strEmail
    
    ' Set string variables
    strContainer = "OU=Suppliers"
    strContactName = "cn=MySupplier1"
    strEmail = "supplier@supplyme.com"
    strYourDescription = "Guy's Contact"
    
    ' Section to attach to Active Directory
    Set objRoot = GetObject("LDAP://rootDSE")
    strDNS = objRoot.Get("defaultNamingContext") 
    Set objDomain = GetObject("LDAP://" & strDNS) 
    
    ' Section to create the contact
    Set objOU = GetObject("LDAP://"& strContainer & "," & strDNS)
    Set objContact = objOU.Create("contact", strContactName)
    objContact.Put "Description", strYourDescription
    objContact.Put "Mail", strEmail
    objContact.SetInfo
    
    Wscript.Echo "Look in " & strContainer & " for (F5) " & strEmail
    
    ' End of Sample Contact VBScript
    
    

    MP
    pátek 6. dubna 2012 10:50
    Vlastník
  • No asi vypadám jako osel, ale ten odkaz už funguje.

    Script také funguje.

    Neumí něco takového jako VB i MsSQL když už tam mám ten AD nalinkovaný?

    pátek 6. dubna 2012 12:45
  • uz to jen obal SQLkem:

    Dim objConn, objRS

    Dim objRoot, objOU, objDomain, objContact, strYourDescription
    Dim strDNS, strContainer, strContactName, strEmail

    strContainer = "OU=contacts"

    Set objRoot = GetObject("LDAP://rootDSE")
    strDNS = objRoot.Get("defaultNamingContext")
    Set objDomain = GetObject("LDAP://" & strDNS)
    Set objOU = GetObject("LDAP://"& strContainer & "," & strDNS)

    Set objConn = CreateObject("ADODB.Connection") objConn.Open "Provider=sqloledb;Data Source=(local);Initial Catalog=contacts;Trusted_Connection=yes" Set objRS = CreateObject("ADODB.Recordset") objRS.Open "select name, description, email from contacts", objConn Do While Not objRS.EOF     Set objContact = objOU.Create("contact", objRS.Fields("name"))     objContact.Put "Description", objRS.Fields("description")     objContact.Put "Mail", objRS.Fields("email")     objContact.SetInfo objRS.movenext Loop

    Nezapomen na zacatek pridat mazani etc.

    MP


    pátek 6. dubna 2012 13:09
    Vlastník
  • Obalit???
    pátek 6. dubna 2012 13:20
  • asi zapnu konzultantske stopky.

    Proste si v SQL udelej cyklus pres recordset obsahujici tvoje zaznamy a do nej zabal (jim obal) vytvareni kontaktu.

    V podstate to tam mas cele, tedy i s preklepy :) - jen si na zacatek pridej smazani stavajicich kontaktu

    Odlad si to treba ve VBA v Excelu :), pak to uloz jako vbs a POSLI SEM PRO DALSI GENERACE nebo ti poslu fakturu :-p

    MP



    pátek 6. dubna 2012 13:30
    Vlastník
  • Děkuji děkuji, za tu fakturu bych se ani nedivil :o)

    Jdu na to.

    MK

    pátek 6. dubna 2012 13:33
  • Odladeno:

    Dim objConn, objRS ' pro SQL
    Dim objRoot, objOU, objDomain, objContact, strDNS, strContainer 'pro AD
    
    'kontaty hledame zde - pozor, bude se brutalne mazat!!!
    strContainer = "OU=contacts"
    
    
    Set objRoot = GetObject("LDAP://rootDSE")
    strDNS = objRoot.Get("defaultNamingContext") 
    Set objDomain = GetObject("LDAP://" & strDNS) 
    Set objOU = GetObject("LDAP://"& strContainer & "," & strDNS)
    
    'smazani vsech kontaktu z OU definovane ve strContainer 
    for each objContact in objOU
    	if objContact.Class="contact" then 'pokud je zde neco jineho nez kontakt nesahama na to 
    		ObjOU.delete "contact","CN=" & objContact.cn
    	end if
    next
    
    
    'ted vybagrujeme kontakty z tabulky contacts databaze contacts v lokalnim SQL a nadrbeme je do AD
    Set objConn = CreateObject("ADODB.Connection")
    objConn.Open "Provider=sqloledb;Data Source=(local);Initial Catalog=contacts;Trusted_Connection=yes"
    
    
    Set objRS = CreateObject("ADODB.Recordset")
    objRS.Open "select name, description, email from contacts", objConn
    Do While Not objRS.EOF
    
    	Set objContact = objOU.Create("contact", "cn=" & objRS.Fields("name"))
    	objContact.Put "Description", rtrim(objRS.Fields("description"))
    	objContact.Put "Mail", rtrim(objRS.Fields("email"))
    	objContact.SetInfo
    
    	objRS.movenext
    Loop
    
    

    MP

    pátek 6. dubna 2012 19:55
    Vlastník
  • Děkuji za trpělivost. Je to perfektní.

    MK

    sobota 7. dubna 2012 17:51
  • Nojo, uz jsem se nemohl divat jak se s tim mordujes :)

    MP

    sobota 7. dubna 2012 18:11
    Vlastník
  • Zdravím mohl bych se ještě zeptat co je špatně na tomto zápisu?

    If IsNull(objRS.Fields("okres")) Then objContact.Put "st", "" Else objContact.Put "st", rtrim(objRS.Fields("okres"))

    Proč nechce zapsat nulovou hodnotu?

    Díky MK

    středa 11. dubna 2012 5:39
  • Proc tam nedas jen:

    if not(IsNull(objRS.Fields("okres"))) then objContact.Put "st", rtrim(objRS.Fields("okres"))

    ?

    MP

    středa 11. dubna 2012 5:43
    Vlastník
  • Proč něco dělat jednoduše když to jde složitě :(

    Díky MK

    středa 11. dubna 2012 5:51
  • Trochu selskeho uvazovani: Ty pises: ve sporitelne se podivam do penezenky. Pokud je prazdna, na vkladni knizku ulozim nula korun, pokud v ni neco najdu ulozim to co v ni mam.

    Logictejsi je prece minimalisticka varianta: pokud je neco v penezence jdu to ulozit.

    MP

    středa 11. dubna 2012 7:20
    Vlastník