Hi
I am running below script which is help to export next 90 days account expiration users from AD.
But I need to send the output file as attachment on mail.. while I am trying getting below error:
Error:
account.vbs(132, 1) CDO.Message.1: The process cannot access the file because it is being used by another process.=================
days= 90Dim adoConnection, adoCommand
Const ADS_UF_ACCOUNTDISABLE = &H02
Const For_reading = 1
Const For_writing = 2
Const For_appending =8
Const CONVERT_TO_LOCAL_TIME = True
Dim objRootDSE, strDNSDomain, strFilter, strQuery, adoRecordset
Dim strDN, objShell, lngBiasKey, lngBias, strDisplay
Dim strfn, strln,strmail,strtitle,strdept,strmngr,strEnabled,strcomp
Dim lngDate, objDate, dtmAcctExp, k, strName
Dim dtmCritical1, lngSeconds1, str64Bit1, dtmCritical2, lngSeconds2, str64Bit2, Objwritefile
' Obtain local time zone bias from machine registry.
set objfso = createobject("scripting.Filesystemobject")
Set Objwritefile = objfso.opentextfile("C:\users.txt", For_writing, True)
Set objShell = CreateObject("Wscript.Shell")
lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Control\" _
& "TimeZoneInformation\ActiveTimeBias")
If (UCase(TypeName(lngBiasKey)) = "LONG") Then
lngBias = lngBiasKey
ElseIf (UCase(TypeName(lngBiasKey)) = "VARIANT()") Then
lngBias = 0
For k = 0 To UBound(lngBiasKey)
lngBias = lngBias + (lngBiasKey(k) * 256^k)
Next
End If
' Use ADO to search the domain.
Set adoConnection = CreateObject("ADODB.Connection")
Set adoCommand = CreateObject("ADODB.Command")
adoConnection.Provider = "ADsDSOOBject"
adoConnection.Open "Active Directory Provider"
Set adoCommand.ActiveConnection = adoConnection
' Determine the DNS domain from the RootDSE object.
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("DefaultNamingContext")
' Convert current date/time to UTC.
dtmCritical1 = DateAdd("n", lngBias, Now())
' Convert to seconds since 1/1/1601.
lngSeconds1 = DateDiff("s", #1/1/1601#, dtmCritical1)
' Convert to 100-nanosecond intervals.
str64Bit1 = CStr(lngSeconds1) & "0000000"
' Determine critical date days in future.
dtmCritical2 = DateAdd("d", days, Now())
' Convert to UTC.
dtmCritical2 = DateAdd("n", lngBias, dtmCritical2)
' Convert to seconds since 1/1/1601
lngSeconds2 = DateDiff("s", #1/1/1601#, dtmCritical2)
' Convert to 100-nanosecond intervals
str64Bit2 = CStr(lngSeconds2) & "0000000"
' Filter to retrieve all user objects with accounts that will expire
' within the specified number of days in the future.
strFilter = "(&(objectCategory=person)(objectClass=user)" _
& "(accountExpires>=" & str64Bit1 & ")(accountExpires<=" & str64Bit2 & "))"
strQuery = "<LDAP://" & strDNSDomain & ">;" & strFilter _
& ";givenname,sn,mail,title,department,company,manager,accountExpires,sAMAccountName,displayName,userAccountControl;subtree"
' Run the query.
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 200
adoCommand.Properties("Timeout") = 1200
adoCommand.Properties("Cache Results") = False
Set adoRecordset = adoCommand.Execute
' Enumerate the recordset.
Objwritefile.writeline "First Name" & vbtab & "Last Name" & vbtab & "Display Name" & vbtab & "Logon Name ( S-ID & A-ID)" & vbtab & "Expiry Date" & vbtab & "Email"& vbtab & "Title" & vbtab & "Department" & vbtab & "status" & vbtab & "company" & vbtab & "Manager"
Do Until adoRecordset.EOF
'strDN = adoRecordset.Fields("distinguishedName").Value
strName = adoRecordset.Fields("sAMAccountName").Value
strDisplay = adoRecordset.Fields("displayName").Value
strfn = adoRecordset.Fields("givenname").Value
strln = adoRecordset.Fields("sn").Value
strmail = adoRecordset.Fields("mail").Value
strtitle = adoRecordset.Fields("title").Value
strdept = adoRecordset.Fields("department").Value
strcomp = adoRecordset.Fields("company").Value
strmngr = adoRecordset.Fields("manager").Value
lngDate = adoRecordset.Fields("accountExpires")
If (adoRecordset.Fields("userAccountControl").Value And ADS_UF_ACCOUNTDISABLE) <> 0 Then
strEnabled = "Disabled"
Else
strEnabled = "Enabled"
End If
Set objDate = lngDate
dtmAcctExp = Integer8Date(objDate, lngBias)
Objwritefile.writeline strfn & vbtab & strln & vbtab & strDisplay & vbtab & strName & vbtab & dtmAcctExp & vbtab & strmail & vbtab & strtitle & vbtab & strdept & vbtab & strenabled& vbtab & strcomp & vbtab & strmngr
adoRecordset.MoveNext
Loop
adoRecordset.Close
' Clean up.
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 bug 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
Integer8Date = CDate(lngDate)
End Function
Set objEmail = CreateObject("CDO.Message")
objEmail.From = "admin@contoso.org"
objEmail.To = "test@constoso.org"
objEmail.Subject = "Server down"
objEmail.Textbody = "Server1 is no longer accessible over the network."
objEmail.AddAttachment "C:\users.txt"
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _
"smtp.contoso.org"
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
==================