Hi folks,
I am having a strange problem. I am VERY new to scripting, and have inherited some scripts that are in production. All of a sudden, one of the scripts is not working and produces the errror "Variable used without being declared". I can't make any sense out of it because nothing has changed since the last time this script worked. I am hoping some of you might be kind enough to have a look at my code and help a total newb out of the woods.
This script checks to see if a user has not logged in in at least 14 days, and if not the account will be disabled. The IF error (Variable used without being declared) occurs on line 39: If $DaysDiff > 14 or $ObjLastLogin = 0 Then
Here's the code:
Dim $members = 0
Dim $UserCount = 0
#include <Date.au3>
#include <Array.au3>
#include <EventLog.au3>
Global $EventLogApp, $aData[1] = [0]
Global $EventLogApp = _EventLog__RegisterSource("", @ScriptName)
If $EventLogApp <> 0 Then _EventLog__Report($EventLogApp, 4, 'None', "2000", @UserName, @ScriptName & " script ran successfully, Exit code " & @error, $aData)
$UserCount = 0
; ------------------------------------------------------------------------------
If FileExists(@ScriptDir & "\DisContractors.txt") Then FileDelete(@ScriptDir & "\DisContractors.txt")
$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
; Open ADO Connection to Active Directory
$objCommand = ObjCreate("ADODB.Command")
$objConnection = ObjCreate("ADODB.Connection")
$objConnection.Provider = "ADsDSOObject"
$objConnection.Open("Active Directory Provider")
; ------------------------------------------------------------------------------
_ADGetGroupMembers($members, "cn=genContractors, ou=General, ou=_SecGroups, dc=mydomain, dc=com", 0)
$objConnection.Close
; ------------------------------------------------------------------------------
$objCommand = ObjCreate("ADODB.Command")
$objConnection = ObjCreate("ADODB.Connection")
$objConnection.Provider = "ADsDSOObject"
$objConnection.Open("Active Directory Provider")
; ------------------------------------------------------------------------------
If $members[0] > 0 Then
For $i = 1 To $members[0]
$objUser = ObjGet("LDAP://" & $members[$i])
If $objUser.AccountDisabled <> -1 Then
$ObjLastLogin = $objUser.Get('lastLogonTimestamp')
If $ObjLastLogin <> 0 Then
$intLogonTime = $ObjLastLogin.HighPart * (2 ^ 32) + $ObjLastLogin.LowPart
$intLogonTime = $intLogonTime / (60 * 10000000)
$LastLoginDate = _DateAdd('n', Int($intLogonTime), "1601/01/01 00:00:00")
$DaysDiff = _DateDiff('d', $LastLoginDate, _NowCalcDate())
EndIf
If $DaysDiff > 14 or $ObjLastLogin = 0 Then
$NewDescription = "User AutoDisabled " & @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC
$Description = $objUser.Get("description")
If $Description = "" Then
$objUser.Put("description", $NewDescription)
$objUser.SetInfo()
Else
$objUser.Put("description", $NewDescription & " -- " & $Description)
$objUser.SetInfo()
EndIf
$UserCount = $UserCount + 1
$objUser.AccountDisabled = True
$objUser.SetInfo
FileWriteLine(@ScriptDir & "\DisContractors.txt", @CRLF & $members[$i])
EndIf
EndIf
Next
EndIf
$objCommand = 0
$objConnection = 0
; ------------------------------------------------------------------------------
Sleep(2000)
If $UserCount > 0 Then RunWait(@ScriptDir & '\bmail.exe -s smtp-int.mydomain.com -t ISAutomation@mydomain.com -f ADJanitor@mydomain.com -a "' & $UserCount & ' AD Accounts Auto Disabled - ' & @MON & '/' & @MDAY & '/' & @YEAR & '" -m "' & @ScriptDir & '\DisContractors.txt" -c')
; ==============================================================================
; _ADGetGroupMembers
; Arguments,
; $members - Array that the result will be stored in
; $group - Group to retrieve members from
; $sort - optional, default 0 : Set to 1 to sort the array
; Returns an array to $members where $members[0] will be the number of users in the group and
; $members[1] to $members[$members[0]] are the distinguished names of the users
Func _ADGetGroupMembers(ByRef $members, $groupdn, $sort = 0)
;If _ADObjectExists($group) = 0 Then Return 0
Local $oUsr, $objCommand, $groups
$objCommand = ObjCreate("ADODB.Command")
$objCommand.ActiveConnection = $objConnection
$objCommand.Properties("Searchscope") = 2
Dim $members[1]
$i = 0
While 1
$rangemodifier = $i * 1000
$range = "Range=" & $rangemodifier & "-" & $rangemodifier + 999
$strCmdText = "<LDAP://" & $groupdn & ">;;member;" & $range & ";base"
$objCommand.CommandText = $strCmdText
$objRecordSet = $objCommand.Execute
$membersadd = $objRecordSet.fields(0).Value
If $membersadd = 0 Then ExitLoop
ReDim $members[UBound($members) + 1000]
For $j = $rangemodifier + 1 To $rangemodifier + 1000
$members[$j] = $membersadd[$j - $rangemodifier - 1]
Next
$i += 1
$objRecordSet.Close
WEnd
$rangemodifier = $i * 1000
$range = "Range=" & $rangemodifier & "-*"
$strCmdText = "<LDAP://" & $groupdn & ">;;member;" & $range & ";base"
$objCommand.CommandText = $strCmdText
$objRecordSet = $objCommand.Execute
$membersadd = $objRecordSet.fields(0).Value
ReDim $members[UBound($members) + UBound($membersadd)]
For $j = $rangemodifier + 1 To $rangemodifier + UBound($membersadd)
$members[$j] = $membersadd[$j - $rangemodifier - 1]
Next
$objRecordSet.Close
$objCommand = 0
$objRecordSet = 0
$members[0] = UBound($members) - 1
If $sort = 1 Then
_ArraySort($members, 0, 1)
EndIf
Return 1
EndFunc ;==>_ADGetGroupMembers
; ============================================================================
Func MyErrFunc()
$HexNumber = Hex($oMyError.number, 8)
If $HexNumber = 80020009 Then
SetError(3)
Return
EndIf
Select
Case $oMyError.windescription = "Access is denied."
$objConnection.Close("Active Directory Provider")
$objConnection.Open("Active Directory Provider")
SetError(2)
Case 1
SetError(1)
EndSelect
Global $EventLogApp, $aData[1] = [0]
Global $EventLogApp = _EventLog__RegisterSource("", "Application Error")
If $EventLogApp <> 0 Then _EventLog__Report($EventLogApp, 1, "None", "1000", @UserName, "AutoTerm was unable to process terminations, Error " & @error, $aData)
_EventLog__Close($EventLogApp)
EndFunc ;==>MyErrFunc
; ============================================================================Dim $members = 0
Any help would be greatly appreciated!!!
Thank you,
I am having a strange problem. I am VERY new to scripting, and have inherited some scripts that are in production. All of a sudden, one of the scripts is not working and produces the errror "Variable used without being declared". I can't make any sense out of it because nothing has changed since the last time this script worked. I am hoping some of you might be kind enough to have a look at my code and help a total newb out of the woods.
This script checks to see if a user has not logged in in at least 14 days, and if not the account will be disabled. The IF error (Variable used without being declared) occurs on line 39: If $DaysDiff > 14 or $ObjLastLogin = 0 Then
Here's the code:
Dim $members = 0
Dim $UserCount = 0
#include <Date.au3>
#include <Array.au3>
#include <EventLog.au3>
Global $EventLogApp, $aData[1] = [0]
Global $EventLogApp = _EventLog__RegisterSource("", @ScriptName)
If $EventLogApp <> 0 Then _EventLog__Report($EventLogApp, 4, 'None', "2000", @UserName, @ScriptName & " script ran successfully, Exit code " & @error, $aData)
$UserCount = 0
; ------------------------------------------------------------------------------
If FileExists(@ScriptDir & "\DisContractors.txt") Then FileDelete(@ScriptDir & "\DisContractors.txt")
$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
; Open ADO Connection to Active Directory
$objCommand = ObjCreate("ADODB.Command")
$objConnection = ObjCreate("ADODB.Connection")
$objConnection.Provider = "ADsDSOObject"
$objConnection.Open("Active Directory Provider")
; ------------------------------------------------------------------------------
_ADGetGroupMembers($members, "cn=genContractors, ou=General, ou=_SecGroups, dc=mydomain, dc=com", 0)
$objConnection.Close
; ------------------------------------------------------------------------------
$objCommand = ObjCreate("ADODB.Command")
$objConnection = ObjCreate("ADODB.Connection")
$objConnection.Provider = "ADsDSOObject"
$objConnection.Open("Active Directory Provider")
; ------------------------------------------------------------------------------
If $members[0] > 0 Then
For $i = 1 To $members[0]
$objUser = ObjGet("LDAP://" & $members[$i])
If $objUser.AccountDisabled <> -1 Then
$ObjLastLogin = $objUser.Get('lastLogonTimestamp')
If $ObjLastLogin <> 0 Then
$intLogonTime = $ObjLastLogin.HighPart * (2 ^ 32) + $ObjLastLogin.LowPart
$intLogonTime = $intLogonTime / (60 * 10000000)
$LastLoginDate = _DateAdd('n', Int($intLogonTime), "1601/01/01 00:00:00")
$DaysDiff = _DateDiff('d', $LastLoginDate, _NowCalcDate())
EndIf
If $DaysDiff > 14 or $ObjLastLogin = 0 Then
$NewDescription = "User AutoDisabled " & @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC
$Description = $objUser.Get("description")
If $Description = "" Then
$objUser.Put("description", $NewDescription)
$objUser.SetInfo()
Else
$objUser.Put("description", $NewDescription & " -- " & $Description)
$objUser.SetInfo()
EndIf
$UserCount = $UserCount + 1
$objUser.AccountDisabled = True
$objUser.SetInfo
FileWriteLine(@ScriptDir & "\DisContractors.txt", @CRLF & $members[$i])
EndIf
EndIf
Next
EndIf
$objCommand = 0
$objConnection = 0
; ------------------------------------------------------------------------------
Sleep(2000)
If $UserCount > 0 Then RunWait(@ScriptDir & '\bmail.exe -s smtp-int.mydomain.com -t ISAutomation@mydomain.com -f ADJanitor@mydomain.com -a "' & $UserCount & ' AD Accounts Auto Disabled - ' & @MON & '/' & @MDAY & '/' & @YEAR & '" -m "' & @ScriptDir & '\DisContractors.txt" -c')
; ==============================================================================
; _ADGetGroupMembers
; Arguments,
; $members - Array that the result will be stored in
; $group - Group to retrieve members from
; $sort - optional, default 0 : Set to 1 to sort the array
; Returns an array to $members where $members[0] will be the number of users in the group and
; $members[1] to $members[$members[0]] are the distinguished names of the users
Func _ADGetGroupMembers(ByRef $members, $groupdn, $sort = 0)
;If _ADObjectExists($group) = 0 Then Return 0
Local $oUsr, $objCommand, $groups
$objCommand = ObjCreate("ADODB.Command")
$objCommand.ActiveConnection = $objConnection
$objCommand.Properties("Searchscope") = 2
Dim $members[1]
$i = 0
While 1
$rangemodifier = $i * 1000
$range = "Range=" & $rangemodifier & "-" & $rangemodifier + 999
$strCmdText = "<LDAP://" & $groupdn & ">;;member;" & $range & ";base"
$objCommand.CommandText = $strCmdText
$objRecordSet = $objCommand.Execute
$membersadd = $objRecordSet.fields(0).Value
If $membersadd = 0 Then ExitLoop
ReDim $members[UBound($members) + 1000]
For $j = $rangemodifier + 1 To $rangemodifier + 1000
$members[$j] = $membersadd[$j - $rangemodifier - 1]
Next
$i += 1
$objRecordSet.Close
WEnd
$rangemodifier = $i * 1000
$range = "Range=" & $rangemodifier & "-*"
$strCmdText = "<LDAP://" & $groupdn & ">;;member;" & $range & ";base"
$objCommand.CommandText = $strCmdText
$objRecordSet = $objCommand.Execute
$membersadd = $objRecordSet.fields(0).Value
ReDim $members[UBound($members) + UBound($membersadd)]
For $j = $rangemodifier + 1 To $rangemodifier + UBound($membersadd)
$members[$j] = $membersadd[$j - $rangemodifier - 1]
Next
$objRecordSet.Close
$objCommand = 0
$objRecordSet = 0
$members[0] = UBound($members) - 1
If $sort = 1 Then
_ArraySort($members, 0, 1)
EndIf
Return 1
EndFunc ;==>_ADGetGroupMembers
; ============================================================================
Func MyErrFunc()
$HexNumber = Hex($oMyError.number, 8)
If $HexNumber = 80020009 Then
SetError(3)
Return
EndIf
Select
Case $oMyError.windescription = "Access is denied."
$objConnection.Close("Active Directory Provider")
$objConnection.Open("Active Directory Provider")
SetError(2)
Case 1
SetError(1)
EndSelect
Global $EventLogApp, $aData[1] = [0]
Global $EventLogApp = _EventLog__RegisterSource("", "Application Error")
If $EventLogApp <> 0 Then _EventLog__Report($EventLogApp, 1, "None", "1000", @UserName, "AutoTerm was unable to process terminations, Error " & @error, $aData)
_EventLog__Close($EventLogApp)
EndFunc ;==>MyErrFunc
; ============================================================================Dim $members = 0
Any help would be greatly appreciated!!!
Thank you,