Windows Vista Forums
Vista Forums Home Join Vista Forums Windows 7 Forum Vista Tutorials Tags
Welcome to Windows Vista Forums. Our forum is dedicated to helping you find solutions with any problems, errors or issues you are experiencing with Windows Vista. The Vista forum also covers news and updates and has an extensive Windows Vista tutorial section that covers a wide range of tips and tricks.

Go Back   Vista Forums > Misc Newsgroups > VB Script

Vista - Need assistance badly!

Reply
 
Old 10-20-2008   #1 (permalink)
JohnCee53


 
 

Need assistance badly!

I need your help. I'm not a scripter, I just edit existing scripts to
make them work for my environment. I've been tasked with making a
script that will run weekly to search Active Directory for users with
special prefixes (we have 4 of these groups) on their SAM Account
Names;
1) am.SAMAccountName
2) re.SAMAccountName
3) es.SAMAccountName
4) ic.SAMAccountName.

Once I have these results, they want them automatically emailed with a
format that shows the SAM Account Name and User Name, and last logon
time.

I have tried cobbling together a script that does this, but have not
gotten it correct to just show me both names at once, let alone
writing the output to a file and emailing it as the body of a
message.


Any help on this would be greatly appreciated!

My System SpecsSystem Spec
Old 10-20-2008   #2 (permalink)
Richard Mueller [MVP]


 
 

Re: Need assistance badly!


<JohnCee53@xxxxxx> wrote in message
news:5d6b8cca-f006-41bf-a74c-3f1900c39c28@xxxxxx
Quote:

>I need your help. I'm not a scripter, I just edit existing scripts to
> make them work for my environment. I've been tasked with making a
> script that will run weekly to search Active Directory for users with
> special prefixes (we have 4 of these groups) on their SAM Account
> Names;
> 1) am.SAMAccountName
> 2) re.SAMAccountName
> 3) es.SAMAccountName
> 4) ic.SAMAccountName.
>
> Once I have these results, they want them automatically emailed with a
> format that shows the SAM Account Name and User Name, and last logon
> time.
>
> I have tried cobbling together a script that does this, but have not
> gotten it correct to just show me both names at once, let alone
> writing the output to a file and emailing it as the body of a
> message.
>
>
> Any help on this would be greatly appreciated!
I'm not sure what you mean. My guess is that the Common Name of the first
group of users is the string "am." followed by the value of the
sAMAccountName of the user. You don't say, but I also assume your domain is
at Windows Server 2003 functional level, so you can use the
lastLogonTimeStamp attribute. This means you can avoid the need to query
every DC in the domain to retrieve the largest lastLogon value for each
user.

I would use ADO in a VBScript program to retrieve all users with the
specifed prefixes. For details on using ADO see this link:

http://www.rlmueller.net/ADOSearchTips.htm

Using the syntax from the link, the filter could be:

strFilter = "(&(objectCategory=person)(objectClass=user)" _
& "(|(cn=am.*)(cn=re.*)(cn=es.*)(cn=ic.*)))"

The comma delimited list of attribute values to retrieve would be:

strAttributes = "sAMAccountName,cn,lastLogonTimeStamp"

This assumes that by "user name" you mean the Common Name of the user. To
convert the value of lastLogonTimeStamp (an Integer8 value) into a date/time
in the local time zone I would use the following function:

http://www.rlmueller.net/Programs/Integer8Date.txt

A script to dump out the values you need could be:
============
Option Explicit

Dim adoCommand, adoConnection, strBase, strFilter, strAttributes
Dim objRootDSE, strDNSDomain, strQuery, adoRecordset, strName, strCN
Dim objShell, lngBiasKey, lngTZBias
Dim objLast, dtmLast

' Obtain local Time Zone bias from machine registry.
Set objShell = CreateObject("Wscript.Shell")
lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Control\" _
& "TimeZoneInformation\ActiveTimeBias")
If (UCase(TypeName(lngBiasKey)) = "LONG") Then
lngTZBias = lngBiasKey
ElseIf (UCase(TypeName(lngBiasKey)) = "VARIANT()") Then
lngTZBias = 0
For k = 0 To UBound(lngBiasKey)
lngTZBias = lngTZBias + (lngBiasKey(k) * 256^k)
Next
End If

' Setup ADO objects.
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection

' Search entire Active Directory domain.
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")
strBase = "<LDAP://" & strDNSDomain & ">"

' Filter on user objects with specified prefixes.

strFilter = "(&(objectCategory=person)(objectClass=user)" _
& "(|(cn=am.*)(cn=re.*)(cn=es.*)(cn=ic.*)))"

' Comma delimited list of attribute values to retrieve.

strAttributes = "sAMAccountName,cn,lastLogonTimeStamp"

' Construct the LDAP syntax query.
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False

' Run the query.
Set adoRecordset = adoCommand.Execute

' Enumerate the resulting recordset.
Do Until adoRecordset.EOF
' Retrieve values and display.
strName = adoRecordset.Fields("sAMAccountName").Value
strCN = adoRecordset.Fields("cn").value
Set objLast = adoRecordset.Fields("lastLogonTimeStamp").Value
dtmLast = Integer8Date(objLast, lngTZBias)
Wscript.cho strName & "," & strCN & "," & CStr(dtmLast)
' Move to the next record in the recordset.
adoRecordset.MoveNext
Loop

' Clean up.
adoRecordset.Close
adoConnection.Close

Function Integer8Date(ByVal objDate, ByVal lngBias)
' Function to convert Integer8 (64-bit) value to a date, adjusted for
' local time zone bias.
Dim lngAdjust, lngDate, lngHigh, lngLow
lngAdjust = lngBias
lngHigh = objDate.HighPart
lngLow = objdate.LowPart
' Account for error in IADsLargeInteger property methods.
If (lngLow < 0) Then
lngHigh = lngHigh + 1
End If
If (lngHigh = 0) And (lngLow = 0) Then
lngAdjust = 0
End If
lngDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
+ lngLow) / 600000000 - lngAdjust) / 1440
' Trap error if lngDate is ridiculously huge.
On Error Resume Next
Integer8Date = CDate(lngDate)
If (Err.Number <> 0) Then
On Error GoTo 0
Integer8Date = #1/1/1601#
End If
On Error GoTo 0
End Function
=========
This VBScript program can be run at a command prompt using the cscript host
so the output can be redirected to a text file. For example, if the program
is saved in the file GetUsers.vbs:

cscript //nologo GetUsers.vbs > report.csv

The file report.csv can be read into a spreadsheet (assuming that no user
names have embedded commas). The method you use to email depends on if you
use Outlook, CDO, or whatever. I personally use a third party tool I
purchased. You could compose and send one message per user in the Do Until
Loop that enumerates the recordset. Someone else may suggest how to do that.

--
Richard Mueller
MVP Directory Services
Hilltop Lab - http://www.rlmueller.net
--


My System SpecsSystem Spec
Old 10-20-2008   #3 (permalink)
JohnCee53


 
 

Re: Need assistance badly!

Thanks! I really appreciate the quick response!
My System SpecsSystem Spec
Reply

Thread Tools


Similar Threads
Thread Forum
Help needed, badly General Discussion
Need Help Badly Vista installation & setup
I need help badly Vista Games
!!!! HELP Badly Needed !!!! Vista hardware & devices
To badly go where no OS has gone before..... Vista General


Vista Forums is an independent web site and has not been authorized,
sponsored, or otherwise approved by Microsoft Corporation.
"Windows Vista", the Start Orb, and related materials are trademarks of Microsoft Corp.
© Designer Media Ltd

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46