directoryservice.vbs - vbscript script by ActiveXperts Software
directoryservice.vbs check whether a user account is disabled or locked out.
Use directoryservice.vbs directly from ActiveXperts Network Monitor; in the Manager's 'Monitor' menu, select 'New Check (Script)' and select directoryservice.vbs. Configure the required parameter, or press 'Load a working sample'.
In ActiveXperts Network Monitor, Administrators can use three different scripting languages: Powershell, VBScript and SSH.
directoryservice.vbs script code
' /////////////////////////////////////////////////////////////////////////////// ' // ActiveXperts Network Monitor - VBScript based checks ' // For more information about ActiveXperts Network Monitor and VBScript, visit ' // http://www.activexperts.com/support/network-monitor/online/vbscript/ ' /////////////////////////////////////////////////////////////////////////////// Option Explicit ' Declaration of global variables Dim SYSDATA, SYSEXPLANATION ' SYSDATA is displayed in the 'Data' column in the Manager; SYSEXPLANATION in the 'LastResponse' column ' Constants - return values Const retvalUnknown = 1 ' ActiveXperts Network Monitor functions should always return True (-1, Success), False (0, Error) or retvalUnknown (1, Uncertain) ' // To test a function outside Network Monitor (e.g. using CSCRIPT from the ' // command line), remove the comment character (') in the following lines: ' Dim bResult ' bResult = CheckAccountLocked( "ACTIVEXPERTS", "jelle" ) ' WScript.Echo "Return value: [" & bResult & "]" ' WScript.Echo "SYSDATA: [" & SYSDATA & "]" ' WScript.Echo "SYSEXPLANATION: [" & SYSEXPLANATION & "]" Function CheckAccountDisabled( strDomain, strAccount ) ' Description: ' Check if the user account specified by strAccount on domain strDomain is disabled ' Parameters: ' 1) strDomain As String - Domain that holds the user account ' 2) strAccount As String - User account name ' Usage: ' CheckAccountDisabled( "<Domain>", "<Domain Account>" ) ' Sample: ' CheckAccountDisabled( "DOMAIN01", "Guest" ) Dim objUser CheckAccountDisabled = retvalUnknown ' Default return value, and will be shown as a yellow (uncertain) icon in the Manager SYSDATA = "" ' SYSDATA displayed in the 'Data' column in the Manager SYSEXPLANATION = "" ' SYSEXPLANATION displayed in the 'LastResponse' column in the Manager On Error Resume Next Set objUser = GetObject("WinNT://" & strDomain & "/" & strAccount & ",user") If( Err.Number <> 0 ) Then CheckAccountDisabled = retvalUnknown SYSEXPLANATION = "Account '" & strDomain & "\" & strAccount & "' could not be found" Exit Function End If On Error Goto 0 If( objUser.AccountDisabled ) Then CheckAccountDisabled = True SYSEXPLANATION = "Account [" & strDomain & "\" & objUser.Name & "] is disabled" Else CheckAccountDisabled = False SYSEXPLANATION = "Account [" & strDomain & "\" & objUser.Name & "] is enabled" End If End Function ' //////////////////////////////////////////////////////////////////////////////////////// Function CheckAccountLocked( strDomain, strAccount ) ' Description: ' Check if the user account specified by strAccount on domain strDomain is locked ' Parameters: ' 1) strDomain As String - Domain that holds the user account ' 2) strAccount As String - User account name ' Usage: ' CheckAccountLocked( "<Domain>", "<Domain Account>" ) ' Sample: ' CheckAccountLocked( "DOMAIN01", "Guest" ) Dim objUser CheckAccountLocked = retvalUnknown ' Default return value, and will be shown as a yellow (uncertain) icon in the Manager SYSDATA = "" ' SYSDATA displayed in the 'Data' column in the Manager SYSEXPLANATION = "" ' SYSEXPLANATION displayed in the 'LastResponse' column in the Manager On Error Resume Next Set objUser = GetObject("WinNT://" & strDomain & "/" & strAccount & ",user") If( Err.Number <> 0 ) Then CheckAccountLocked = retvalUnknown SYSEXPLANATION = "Account '" & strDomain & "\" & strAccount & "' could not be found" Exit Function End If On Error Goto 0 If( objUser.IsAccountLocked ) Then CheckAccountLocked = False SYSEXPLANATION = "Account [" & strDomain & "\" & objUser.Name & "] is locked" Else CheckAccountLocked = True SYSEXPLANATION = "Account [" & strDomain & "\" & objUser.Name & "] is not locked" End If End Function ' /////////////////////////////////////////////////////////////////////////////// Function CheckAccountsLockedInGroup( strDomain, strGroup ) ' Description: ' Check if there's one or more accounts locked in a group ' Parameters: ' 1) strDomain As String - Domain that holds the user- and group account ' 2) strGroup As String - Domain group name ' Usage: ' CheckAccountsLockedInGroup( "<Domain>", "<Domain Group>" ) ' Sample: ' CheckAccountsLockedInGroup( "DOMAIN01", "Domain Users" ) Dim objGroup, objUser Dim strLockedAccounts CheckAccountsLockedInGroup = retvalUnknown ' Default return value, and will be shown as a yellow (uncertain) icon in the Manager SYSDATA = "" ' SYSDATA displayed in the 'Data' column in the Manager SYSEXPLANATION = "" ' SYSEXPLANATION displayed in the 'LastResponse' column in the Manager strLockedAccounts = "" On Error Resume Next Set objGroup = GetObject("WinNT://" & strDomain & "/" & strGroup & ",group") If( Err.Number <> 0 ) Then CheckAccountsLockedInGroup = retvalUnknown SYSEXPLANATION = "Domain or group not found" Exit Function End If On Error Goto 0 For Each objUser in objGroup.Members If( Err.Number <> 0 ) Then CheckAccountsLockedInGroup = False SYSEXPLANATION = "Unable to retrieve group members" Exit Function End If On Error Resume Next Set objUser = GetObject("WinNT://" & strDomain & "/" & objUser.Name & ",user") If( Err.Number <> 0 ) Then CheckAccountsLockedInGroup = retvalUnknown SYSEXPLANATION = "Unable to retrieve properties for account [" & objUser.Name & "]" Exit Function End If On Error Goto 0 If( objUser.IsAccountLocked ) Then If( strLockedAccounts <> "" ) Then strLockedAccounts = strLockedAccounts & ", " End If strLockedAccounts = strLockedAccounts & objUser.Name End If Next If( strLockedAccounts <> "" ) Then CheckAccountsLockedInGroup = False SYSEXPLANATION = "Account(s) [" & strLockedAccounts & "] are locked in Domain [" & strDomain & "]" Else CheckAccountsLockedInGroup = True SYSEXPLANATION = "No Accounts are locked in Domain [" & strDomain & "]" End If End Function ' /////////////////////////////////////////////////////////////////////////////// Function CheckGroupMembership( strDomain, strGroup, strUser ) ' Description: ' Check if a user, specified by strUser, is member of group strGroup on domain strDomain ' Parameters: ' 1) strDomain As String - Domain that holds the user- and group account ' 2) strGroup As String - Domain group name ' 3) strUser As String - User name ' Usage: ' CheckGroupMembership( "<Domain>", "<Domain Group>", "<Domain Account>" ) ' Sample: ' CheckGroupMembership( "DOMAIN01", "Guests", "Guest" ) Dim objGroup, objUser CheckGroupMembership = retvalUnknown ' Default return value, and will be shown as a yellow (uncertain) icon in the Manager SYSDATA = "" ' SYSDATA displayed in the 'Data' column in the Manager SYSEXPLANATION = "" ' SYSEXPLANATION displayed in the 'LastResponse' column in the Manager On Error Resume Next Set objGroup = GetObject("WinNT://" & strDomain & "/" & strGroup & ",group") If( Err.Number <> 0 ) Then CheckGroupMembership = retvalUnknown SYSEXPLANATION = "Domain or group not found" Exit Function End If On Error Goto 0 For Each objUser in objGroup.Members If( Err.Number <> 0 ) Then CheckGroupMembership = False SYSEXPLANATION = "Unable to list group members" Exit Function End If If( UCase( objUser.Name ) = UCase( strUser ) ) Then CheckGroupMembership = True SYSEXPLANATION = "[" & strDomain & "\" & strUser & "] is member of group [" & strGroup & "]" Exit Function End If Next CheckGroupMembership = False SYSEXPLANATION = "[" & strDomain & "\" & strUser & "] is NOT member of group [" & strGroup & "]" End Function ' /////////////////////////////////////////////////////////////////////////////// Function CheckLDAPServer( strHost, strAltCredentials, strExpected ) ' Description: ' Query an LDAP server and match the response ' Parameters: ' 1) strHost As String - Server to send the LDAP query to ' 2) strAltCredentials As String - Specify an empty string to use Metwork Monitor service credentials. ' To use alternate credentials, enter a server that is defined in Server Credentials table. ' (To define Server Credentials, choose Tools->Options->Server Credentials)' Usage: ' 3) strExpected As String - Expected response ' Usage: ' CheckLDAPServer( "<Hostname | IP>", "", "<Expected Response>" ) Dim objLDAP, strPath Dim strAltLogin, strAltPassword CheckLDAPServer = retvalUnknown ' Default return value, and will be shown as a yellow (uncertain) icon in the Manager SYSDATA = "" ' SYSDATA displayed in the 'Data' column in the Manager SYSEXPLANATION = "" ' SYSEXPLANATION displayed in the 'LastResponse' column in the Manager strAltLogin = "" strAltPassword = "" ' If alternate credentials are specified, retrieve the alternate login and password from the ActiveXperts global settings, and logon If( strAltCredentials <> "" ) Then If( Not getCredentials( strHost, strAltCredentials, strAltLogin, strAltPassword, SYSEXPLANATION )) Then Exit Function End If If( Not netLogon( strHost, strAltLogin, strAltPassword, SYSEXPLANATION ) ) Then Exit Function End If End If On Error Resume Next Set objLDAP = GetObject( "LDAP://" & strHost & "/RootDse" ) If( objLDAP Is Nothing ) Then SYSEXPLANATION = "LDAP query failed" Else CheckLDAPServer = True strPath = objLDAP.get( "DefaultNamingContext" ) If( InStr( strPath , strExpected ) <> 0 ) Then CheckLDAPServer = True SYSEXPLANATION = "LDAP server was queried, response=[" & strPath &"] matched string [" & strExpected & "]" Else CheckLDAPServer = False SYSEXPLANATION = "LDAP server was queried, response=[" & strPath &"] did not match string [" & strExpected & "]" End If End If On Error Goto 0 ' If alternate login is used, logoff now If( strAltLogin <> "" ) Then netLogoff( strHost ) End If End Function ' /////////////////////////////////////////////////////////////////////////////// Function VerifyGroupMembers( strDomain, strGroup, strMemberList ) ' Description: ' Check all members of strGroup. If an element of this group is not member of the strMemberList, then False is returned. ' Use it to check if the Domain Admin or Enterpise Admin group has no unexpected members. ' Parameters: ' 1) strDomain As String - Domain that holds the user- and group account ' 2) strGroup As String - Domain group name ' 3) strUser As String - User name ' Usage: ' VerifyGroupMembers( "<Domain>", "<Domain Group>", "<Domain User 1>...<Domain User n>" ) ' Sample: ' VerifyGroupMembers( "DOMAIN01", "Administrators", "Administrator,James,William" ) Dim objGroup, objUser Dim bMemberFound, arrUsers, i VerifyGroupMembers = retvalUnknown ' Default return value, and will be shown as a yellow (uncertain) icon in the Manager SYSDATA = "" ' SYSDATA displayed in the 'Data' column in the Manager SYSEXPLANATION = "" ' SYSEXPLANATION displayed in the 'LastResponse' column in the Manager On Error Resume Next Set objGroup = GetObject("WinNT://" & strDomain & "/" & strGroup & ",group") If( Err.Number <> 0 ) Then VerifyGroupMembers = retvalUnknown SYSEXPLANATION = "Domain or group not found" Exit Function End If On Error Goto 0 arrUsers = Split( strMemberList, "," ) For Each objUser In objGroup.Members If( Err.Number <> 0 ) Then VerifyGroupMembers = retvalUnknown SYSEXPLANATION = "Unable to list group members" Exit Function End If bMemberFound = False For i = 0 To UBound( arrUsers ) If( UCase( Trim( arrUsers(i) ) ) = UCase( Trim( objUser.Name ) ) ) Then bMemberFound = True Exit For End If Next If( Not bMemberFound ) Then VerifyGroupMembers = False SYSEXPLANATION = "User [" & objUser.Name & "] is not allowed as a member of group [" & strGroup & "]" Exit Function End If Next VerifyGroupMembers = True SYSEXPLANATION = "All members of group [" & strGroup & "] are allowed members" End Function ' ////////////////////////////////////////////////////////////////////////////// ' // --- Private Functions section --- ' // Private functions names should start with a lower case character, so they ' // will not be listed in the Network Monitor's function browser. ' ////////////////////////////////////////////////////////////////////////////// Function netLogon( strHost, strAltLogin, strAltPassword, strSysExplanation ) Dim objRemoteServer netLogon = False strSysExplanation = "" Set objRemoteServer = CreateObject( "ActiveXperts.RemoteServer" ) If( strAltLogin = "" ) Then netLogon = True Exit Function End If objRemoteServer.Connect strHost, strAltLogin, strAltPassword If( objRemoteServer.LastError <> 0 ) Then netLogon = False strSysExplanation = "Login failed" Exit Function End If netLogon = True End Function ' ////////////////////////////////////////////////////////////////////////////// Function netLogoff( strHost ) Dim objRemoteServer netLogoff = False Set objRemoteServer = CreateObject( "ActiveXperts.RemoteServer" ) objRemoteServer.Disconnect strHost If( objRemoteServer.LastError <> 0 ) Then netLogoff = False Exit Function End If netLogoff = True End Function