MartyConnelly
martyconnelly at shaw.ca
Fri Mar 17 14:10:29 CST 2006
You could try code samples like this. Most of this type of code using LDAP, ADSI and WMI is written in VBScript but is easily modifiable into VBA. Just define the objects and variants. Look around this site with 100's of sample vbscripts http://www.activexperts.com/activmonitor/windowsmanagement/scripts/activedirectory/computer/#ListAllComputer.htm Sub testnames() 'List All Computer Accounts in Active Directory 'Returns the name and location for all the computer accounts in Active Directory. Const ADS_SCOPE_SUBTREE = 2 Dim objConnection As Object Dim objCommand As Object Dim objrecordset As Object 'points at domain fabrikam.com Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection 'note sample domain below is fabrikam.com objCommand.CommandText = _ "Select Name, Location from 'LDAP://DC=fabrikam,DC=com' " _ & "Where objectClass='computer'" objCommand.Properties("Page Size") = 1000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE Set objrecordset = objCommand.Execute objrecordset.MoveFirst Do Until objrecordset.EOF Debug.Print "Computer Name: " & objrecordset.Fields("Name").Value Debug.Print "Location: " & objrecordset.Fields("Location").Value objrecordset.MoveNext Loop Set objrecordset = Nothing Set objConnection = Nothing Set objCommand = Nothing End Sub Sub test() ' You can get the creation date for each account from Active 'Directory. Every AD object has a WhenCreated and WhenChanged 'attribute. You can dump these attributes into a flat file using 'the LDIFDE utility, or you can dump them into a comma-delimited 'file using CSVDE (both utilities come with Windows 2000). 'Here 's the syntax to dump the two attributes for the user 'objects in an OU called Phoenix in a domain called Company.com 'to the console for viewing (the entire entry should typed as a 'single line): ' ldifde -d ou=phoenix,dc=company,dc=com -l whencreated, ' whenchanged -p onelevel -r "(ObjectCategory=user)" ' -f con 'If you wanted to save the dump to a file, change the "-f" switch 'from "con" to a file name. 'The last logon timestamp uses this format: YYYYMMDDHHMMSS, with 'the hour shown in Universal Coordinated Time. A time stamp of '20040115182937.0Z corresponds to Jan 15 2004 18:29:37 UCT. 'USRSTAT is slow, and the report you get has to be merged with 'the LDIFDE dump. So, I put together a script that searches for 'user objects at each domain controller, then lists the local 'logon time and the creation time. The user logon timestamp 'requires conversion from a long integer. I borrowed the 'conversion code comes from Richard L. Mueller '( http://www.rlmueller.net/Programs ). Richard's full script 'also takes the local time zone from the Registry and converts 'the time from UCT to local time. Nifty. 'Establish ADO Constants Const ADS_CHASE_REFERRALS_NEVER = &O0 Const ADS_CHASE_REFERRALS_SUBORDINATE = &O20 Const ADS_CHASE_REFERRALS_EXTERNAL = &O40 Const ADS_CHASE_REFERRALS_ALWAYS = &O60 Const ADS_SCOPE_BASE = 0 Const ADS_SCOPE_ONELEVEL = 1 Const ADS_SCOPE_SUBTREE = 2 Dim RootDSE As Object Dim domainDN As Object Dim Connection As Object Dim dc As Object Dim dcList As Object Dim rs As ADODB.Recordset Dim adoLastLogon As Object Dim logondate As Object Dim longdate As Object Dim longDateHigh As Long Dim longDateLow As Long Dim oNet As Object Set oNet = CreateObject("Wscript.Network") Debug.Print oNet.UserName 'Get Distinguished Name for local domain 'Set RootDSE = GetObject("LDAP://RootDSE") 'Set RootDSE = GetObject("LDAP://MARTIN") Set RootDSE = GetObject("LDAP://marty") domainDN = RootDSE.Get("DefaultNamingContext") 'Initialize ADO connection Set Connection = CreateObject("ADODB.Connection") Connection.Provider = "ADsDSOObject" Connection.Open Set Command = CreateObject("ADODB.Command") Set Command.ActiveConnection = Connection Command.Properties("Page Size") = 1000 Command.Properties("Timeout") = 30 Command.Properties("searchscope") = ADS_SCOPE_SUBTREE Command.Properties("Chase referrals") = ADS_CHASE_REFERRALS_NEVER Command.Properties("Cache Results") = False 'Get list of domain controllers for the domain Set dcList = GetObject("LDAP://ou=domain controllers," & _ domainDN) 'Walk each domain controller for logons For Each dc In dcList Debug.Print String(40, "=") Debug.Print "Logon dates at " & dc.DNSHostName Command.CommandText = "SELECT name,lastlogon," & _ "whencreated,whenchanged FROM " & _ "'LDAP://" & dc.DNSHostName & "/" & _ domainDN & "' WHERE objectcategory = 'user'" Set rs = Command.Execute Do Until rs.EOF adoLastLogon = rs.Fields("lastlogon") On Error Resume Next Err.Clear Set longdate = adoLastLogon If Err.Number <> 0 Then Err.Clear logondate = "No Local Logon" Else longDateHigh = longdate.HighPart longDateLow = longdate.LowPart If (longDateLow = 0) And (longDateHigh = 0) Then logondate = "No Local Logon" Else If longDateLow < 0 Then longDateHigh = longDateHigh + 1 logondate = #1/1/1601# + (((longDateHigh * (2 ^ 32)) _ + longDateLow) / 600000000 / 1440) End If End If Debug.Print "User Name: " & rs.Fields("name") Debug.Print " Last logon: " & logondate Debug.Print " Object Created: " & rs.Fields("WhenCreated") Debug.Print " Object Modified: " & rs.Fields("WhenChanged") rs.MoveNext Loop 'Debug.Print vbNL Next ' WScript.Quit() 'As you mentioned, Zev, Windows Server 2003 has an additional 'attribute called LastLogonTimestamp that replicates to every 'domain controller once you shift to a Windows Server 2003 'functional level. You can rewrite this script to search for 'the contents of LastLogonTimestamp on any domain controller. End Sub Lonnie Johnson wrote: >Does anyone have code or a model of a procedure that will allow me to query members of the Active Directory? > > >May God bless you beyond your imagination! >Lonnie Johnson >ProDev, Professional Development of MS Access Databases >Visit me at ==> http://www.prodev.us > > > > > > > > > > > > >--------------------------------- >Yahoo! Travel > Find great deals to the top 10 hottest destinations! > > -- Marty Connelly Victoria, B.C. Canada