Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Usare dati da Active Directory

120 views
Skip to first unread message

OxygeN

unread,
Nov 17, 2005, 5:53:03 AM11/17/05
to
Ciao a tutti,
mi chiedevo se fosse possibile da Access (2002) accedere ai record di
Active Directory per poter utilizzare i nomi utente in un db che sto
realizzando. Se fosse possibile, vorrei semplicemente da Access fare dei
"riferimenti" ad AD, senza copiare i dati (nome utente).

Chi mi sa aiutare?

Grazie.

Lorenzo(pyx)

unread,
Nov 17, 2005, 7:49:14 AM11/17/05
to

Ciao,
l'argomento e' piuttosto complesso e vasto, ti conviene
iniziare da una ricerca sul web anche se la maggior parte
di informazioni sono in inglese e altrettante in francese\tedesco :-(


http://groups.google.it/groups?hl=it&q=ldap+vba&qt_s=Ricerca

Ciao
--
lorenzo

giorgio rancati

unread,
Nov 17, 2005, 8:01:18 AM11/17/05
to
"OxygeN" <bonny...@despammed.com> ha scritto nel messaggio
news:dlhnea$igt$1...@mophus.csi.it...

Ciao,

con una piccola sub in vba potresti leggere i nomi degli utenti e popolare
una tua tabella.
Ma tu cosa intendi senza copiare i dati ?

Ciao
--
Giorgio Rancati
[Office Access MVP]


OxygeN

unread,
Nov 17, 2005, 8:18:50 AM11/17/05
to
giorgio rancati wrote:

> Ciao,
>
> con una piccola sub in vba potresti leggere i nomi degli utenti e popolare
> una tua tabella.

Conta che sono proprio "niubbo" su Access... :-/

> Ma tu cosa intendi senza copiare i dati ?

Eh, appunto non vorrei "popolare una tabella", bensì fare solamente
riferimento al record presente in AD. Ora però mi viene un dubbio: nel
momento in cui io elimino l'utente da AD (perchè non lavora più qui),
perderei il collegamento, vero? Tu cosa suggerisci di fare?

Grazie..

OxygeN

unread,
Nov 17, 2005, 8:19:36 AM11/17/05
to
Lorenzo(pyx) wrote:

> Ciao,
> l'argomento e' piuttosto complesso e vasto, ti conviene
> iniziare da una ricerca sul web anche se la maggior parte
> di informazioni sono in inglese e altrettante in francese\tedesco :-(
>
>
> http://groups.google.it/groups?hl=it&q=ldap+vba&qt_s=Ricerca

Per il Tedesco e l'Inglese non ho problemi... ma è "fattibile" per un
"niubbo" come me??? :-o

Lorenzo(pyx)

unread,
Nov 17, 2005, 8:28:40 AM11/17/05
to

Vediamo che ci dice Giorgio.
Quello che ho trovato in italiano erano msg che poi partivano
per la tangente, in inglese si arenavano quasi ad un passo ....
quelli in tedesco li ho capiti praticamente nulla ...
e i piu' interessanti mi sembravano quelli in Francese.

Probabilmente sarà da interfacciarsi con librerie (DLL del sistema operativo)
questo non e' particolarmente difficile come e' sicuro che Giorgio
riesce a spiegarsi bene.
Se le tue esigenze sono limitate puo' essere che sia affrontabile con poco,
sono curioso anch'io ;-)

Ciao
--
Lorenzo

giorgio rancati

unread,
Nov 17, 2005, 8:46:17 AM11/17/05
to
"OxygeN" <bonny...@despammed.com> ha scritto nel messaggio
news:dlhvvk$lm7$2...@mophus.csi.it...
>
> Eh, appunto non vorrei "popolare una tabella", bensě fare solamente
> riferimento al record presente in AD. Ora perň mi viene un dubbio: nel
> momento in cui io elimino l'utente da AD (perchč non lavora piů qui),

> perderei il collegamento, vero? Tu cosa suggerisci di fare?
>
> Grazie..

ma.. io creerei una tabella con i campi Nome e Attivo, poi quando ci sono
modifiche andrei a Popolarla/Aggiornarla eseguendo una Sub

quindi data uan tabella di nome Utenti con io campo Nome (tipo testo) e
Attivo (tipo Sě/No)
-----
Sub AggiornaUtenti()

Dim NomeDominio As String
Dim Dominio As Object
Dim Filtro As String
Dim AD As Object
Dim TbUtenti As New ADODB.Recordset

NomeDominio = "NomeDominio"
Filtro = "User"

'Imposto lo stato attivo a false per tutti gli utenti
CurrentProject.Connection.Execute "Update [Utenti] Set [Attivo]=0"

'Apro la tabella utenti
TbUtenti.CursorType = adOpenKeyset
TbUtenti.CursorLocation = adUseServer
TbUtenti.LockType = adLockOptimistic
TbUtenti.Open "Utenti", CurrentProject.Connection

'Apro il dominio
Set Dominio = GetObject("WinNT://" & NomeDominio)
Dominio.Filter = Array(Filtro)

'Popolo/sincronizzo la tabella utenti
For Each AD In Dominio
TbUtenti.Find "Nome='" & AD.Name & "'"
If TbUtenti.EOF Then
TbUtenti.AddNew
End If
TbUtenti!Nome = AD.Name
TbUtenti!Attivo = True
TbUtenti.Update

Next

'Chiudo e distruggo gli oggetti
TbUtenti.Close
Set TbUtenti = Nothing
Set Dominio = Nothing

End Sub
----

giorgio rancati

unread,
Nov 17, 2005, 8:51:27 AM11/17/05
to
"giorgio rancati" <giorgio_No_Sp...@tiscali.it> ha scritto nel
messaggio news:e%23Czv036...@TK2MSFTNGP14.phx.gbl...

> "OxygeN" <bonny...@despammed.com> ha scritto nel messaggio
> news:dlhvvk$lm7$2...@mophus.csi.it...

dimenticavo....

ho preso spunto da qui
----
HOW TO: Populate a SQL Server 2000 Database with Information from Active
Directory
http://support.microsoft.com/default.aspx?scid=kb;en-us;319716

OxygeN

unread,
Nov 17, 2005, 8:59:45 AM11/17/05
to
Lorenzo(pyx) wrote:

> Vediamo che ci dice Giorgio.
> Quello che ho trovato in italiano erano msg che poi partivano
> per la tangente, in inglese si arenavano quasi ad un passo ....
> quelli in tedesco li ho capiti praticamente nulla ...
> e i piu' interessanti mi sembravano quelli in Francese.

... e proprio il Francese è il mio "buco"... (o baco?!?)... vabbè...

> Probabilmente sarà da interfacciarsi con librerie (DLL del sistema
> operativo)
> questo non e' particolarmente difficile come e' sicuro che Giorgio
> riesce a spiegarsi bene.

Spero proprio di essere in grado di capire, a questo punto!

> Se le tue esigenze sono limitate puo' essere che sia affrontabile con poco,
> sono curioso anch'io ;-)

Bene, grazie intanto... seguo l'altro ramo del thread ora... ;-)

Lorenzo(pyx)

unread,
Nov 17, 2005, 12:03:03 PM11/17/05
to

Ciao Giorgio,
Ho provato ad approfondire, visto che di solito uso componenti gia' pronti.
Qualcosa ho trovato , ho anche provato il tuo codice su un server 2003,
e mi tirava fuori piu' cose di quello che dovesse. Presumo che con
>Filtro = "User"
vengano filtrati gli oggetti che come tipo sono "User" e quindi
si possono ritrovare anche oggetti che in realtà non sono proprio
user anche se identificati da questo tipo (Utenti di sistema, di debug etc.
che quasi sempre sono in stato Disabled)

Probabilmente il binding con un Server AD va con un provider LDAP
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/adsi_system_providers.asp

Che poi le cose si complicano se sono montate anche le estensioni di AD.

Poi, alla fine, basata su questi suggerimenti:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/e2k3/e2k3/_clb_enumerating_a_users_dls_vb.asp

Ne e' uscita una sub che ricava in automatico il dominio dove e' autenticato
il pc. Nei riferimenti Access e' necessario aggiungere "ActiveDS Type library"

Quello che e' interessante, credo, sono le proprietà dell'oggetto ObjUser che si
ricavano anche con l'intellisense in debug mode.

Sub List_Users_AD()

Dim objUser As IADsUser
Dim objContainer As IADsContainer

Dim Domain As Object
Dim DomainName

On Error GoTo Error

DomainName = GetObject("LDAP://RootDSE").Get("DefaultNamingContext")
Set objContainer = GetObject("LDAP://CN=users," & DomainName)
objContainer.Filter = Array("User")

For Each objUser In objContainer
'solo account abilitati
If objUser.AccountDisabled = False Then
Debug.Print Right(objUser.name, Len(objUser.name) - 3), objUser.FullName
End If
Next

Exit Sub

Error:
MsgBox "Run time error: " + str(Err.Number) + " " + Err.Description
Err.Clear

End Sub


Ciao
--
Lorenzo


giorgio rancati

unread,
Nov 17, 2005, 1:06:37 PM11/17/05
to
"Lorenzo(pyx)" <Lorenzo[ThanksAntiSpam]@pyx.it> ha scritto nel messaggio
news:eBLavi56...@tk2msftngp13.phx.gbl...

> Ne e' uscita una sub che ricava in automatico il dominio dove e'
autenticato
> il pc. Nei riferimenti Access e' necessario aggiungere "ActiveDS Type
library"
>
> Quello che e' interessante, credo, sono le proprietà dell'oggetto ObjUser
che si
> ricavano anche con l'intellisense in debug mode.

grazie per queste info aggiuntive :-)

Personalmente non amo aggiungere riferimenti ad Access, lo faccio proprio se
sono costretto :-)
Vedo comunque che il tuo codice non ha bisogno del riferimento alla libreria
esterna, infatti crei gli oggetti con GetObject.

Togliendo la dim potresti farne a meno
----
Sub List_Users_AD()

Dim objUser As Object
Dim objContainer As Object

Dim Domain As Object
Dim DomainName

.......
.......
........
----

la lista delle proprietà e del loro significato si può prendere da qui.
----
IADsUser
http://msdn.microsoft.com/library/en-us/adsi/adsi/iadsuser.asp?frame=true
----
Proprietà che si possono usare anche con il provider WinNt (quello usato nel
mio esempio)

Lorenzo(pyx)

unread,
Nov 17, 2005, 1:27:21 PM11/17/05
to
giorgio rancati wrote:
> "Lorenzo(pyx)" <Lorenzo[ThanksAntiSpam]@pyx.it> ha scritto nel
> messaggio news:eBLavi56...@tk2msftngp13.phx.gbl...
[...]

>
> Personalmente non amo aggiungere riferimenti ad Access, lo faccio
> proprio se sono costretto :-)

Sono d'accordo :-) poi quando si va in distribuzione runtime al
75% sono pianti.

Quando devo interagire con il sistema o interfacce a basso
livello preferisco altri tool con componenti gia' collaudati che
comunque possono fare da "cover" ad Access.

> Vedo comunque che il tuo codice non ha bisogno del riferimento alla
> libreria esterna, infatti crei gli oggetti con GetObject.
>

[...]

Vero, ovviamente sono partito dal codice base,copia-incolla
e poi ci ho costruito su. ;-)

>
> la lista delle proprietà e del loro significato si può prendere da
> qui. ----
> IADsUser
> http://msdn.microsoft.com/library/en-us/adsi/adsi/iadsuser.asp?frame=true
> ----
> Proprietà che si possono usare anche con il provider WinNt (quello
> usato nel mio esempio)

Qui ho ancora qualche dubbio, non nel senso che non funzioni, perche' funziona
ovviamente, ma quanto sul fatto, se non ho capito male,. il provider WinNt e'
mantenuto per compatibilità e non credo dia accesso alle estensioni di AD quali
possono essere le estensioni di Exchange Server.
Dovro ri-approfondire.

> Ciao
> --
> Giorgio Rancati
> [Office Access MVP]

Ciao
--
lorenzo


0 new messages