You are on page 1of 116

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="description" content="Created by Stuart Barrett"> <meta name="description" content="Last Update:

03/01/12"> <title>AD Management Utility</title> <HTA:APPLICATION id="objADManage" applicationname="ADManageUtil" border="thin" borderstyle="normal" caption="AD Management Utility" contextmenu="no" icon="otherFiles\globe.ico" maximizebutton="no" minimizebutton="yes" navigable="yes" scroll="no" selection="yes" singleinstance="yes" sysmenu="yes" version="1.5" windowstate="normal" /> <style type="text/css"> body { font-size:0.9em; cursor: default; font-family: "trebuchet ms", calibri, helvetica, sans-serif, "Times New Roman"; } input { font-family: "trebuchet ms", calibri, helvetica, sans-serif, "Times New Roman"; } input.button { color: black; cursor: hand; background-color: white; border: #000033 2px solid; font-weight: bold; } input.text { border: #000033 1px solid; font-weight: bold; height: 23px; } input.btnhov { border-color: #000033; background-color: #cccccc; } input.disabled { background-color: #eeeeee; border-color: #888888; cursor: default; }

input.userdis { background-color: white; border-color: #888888; border-width: 2px; } input.checkbox { padding: 1em; border: 2px solid black; } input.checkbox.disabled { border-color: #888888; } select { font-family: "trebuchet ms", calibri, helvetica, sans-serif, "Times New Roman"; border: #000033 1px solid; height: 23px; } option.group { background-color: #FFFFCC; } select.disabled { background-color: #eeeeee; color: #888888; border-color: #888888; } table.controltable { border-collapse: collapse; table-layout: fixed; } table.controltable th { } table.controltable td { height: 23px; } table.layout { border-collapse: collapse; width: 100%; } table.layout th, td { padding: 0px 10px; vertical-align:top; font-size: 0.8em; } .layoutheader { padding-top: 5px; padding-bottom: 10px; width: 50%; font-weight: bold; text-decoration: underline; font-size: 0.9em; } .hidden { display: none; visibility: hidden; } .spanlink { text-decoration: underline; font-weight:bold; color: blue;

cursor: hand; } a { text-decoration: none; } .greenbold { color: green; font-weight: bold; } .redbold { color: red; font-weight: bold; } .infoTD { width: 200px; height: 23px; border: 1px solid #000033; background-color: white; font-weight: bold; vertical-align: middle; } .infoTD.disabled { background-color: #eeeeee; border-color: #888888; cursor: default; } .L3 { vertical-align: middle; background-color: white; } .L3Upper { border-top: 2px solid #000033; } .L3Lower { border-bottom: 2px solid #000033; } .L3Left { border-left: 2px solid #000033; } .L3Right { border-right: 2px solid #000033; } .L3Middle { border-top: 1px solid #003333; } .L3Upper.disabled, .L3Lower.disabled, .L3Left.disabled, .L3Right.disabled, .L3Middle.disabled { background-color: #eeeeee; border-color: #888888; } .bottommenuleft { position: absolute; bottom: 15px; left: 10px; font-weight: bold; } .bottommenuright { position: absolute; bottom: 15px;

right: 10px; font-weight: bold; } #TopBar { font-style: italic; position: absolute; font-weight: bold; top: 18px; right: 15px; font-size: 0.9em; color: #888888; } #VersionInfo { position: absolute; top: 20px; right: 10px; font-style: italic; color: #888888; } #layout1, #layout2, #layout3, #loadingdiv, #layoutuser, #layoutgroup, #LayoutSettings { overflow: auto; background-color: #eeeeee; height: 95%; width: 100%; } #UserTableSpan, #PCTableSpan, #GroupTableSpan { position: absolute; top: 40px; left: 10px; overflow: auto; background-color: #eeeeee; border: solid #888888 1px; border-bottom-width: 0px; height: 485px; width: 100%; } #UsernameSearchSpan { position: absolute; left: 30px; bottom: 100px; width: 350px; height: 350px; overflow: auto; } #UserExportOptionsSpan { position: absolute; left: 60px; top: 50px; width: 350px; padding-top: 0px; background-color: white; border: 1px solid black; z-index: 1; } #LUDNSpan, .DelegateSpan { background-color: white; overflow: auto;

width: 100%; height: 55; border: #000033 1px solid; padding: 5px; margin-left: 10px; margin-right: 10px; } #LUDNSpan.disabled { border-color: #888888; background-color: #eeeeee; } #nonusertable { border-collapse: collapse; width: "100%"; } #nonusertable th { background-color: "black"; text-align: left; color: "white"; height: 25px; cursor: "hand"; border: #888888 solid; border-width: 1px 0px; border-collapse: collapse; } #nonusertable td { background-color: "white"; border: #888888 solid; border-width: 1px 0px; border-collapse: collapse; } #usertable, #nonusertable1 { border-collapse: collapse; width: "100%"; } #usertable th, #nonusertable1 th { background-color: "black"; text-align: left; color: "white"; height: 25px; cursor: "hand"; border: #888888 solid; border-width: 1px 0px; border-collapse: collapse; } #usertable td, #nonusertable1 td { background-color: "white"; border: #888888 solid; border-width: 1px 0px; border-collapse: collapse; } #sublayout, #sublayout1, #sublayout2, #sublayout3, #sublayout4, #sublayout5 { width: 100%; border-collapse: collapse; } #sublayout, #sublayout1, #sublayout2, #sublayout3, #sublayout4, #sublayout5 th, td {

height: 23px; } #SpiceworksGush { background-color: #FD7908; border: 2px solid black; padding: 5px; display: block; position: relative; top: 75px; left: 75px; width: 80%; } </style> </head> <script Language="VBScript"> '#============================================================================== '#============================================================================== '# SCRIPT.........: ADManagementUtility.hta '# AUTHOR.........: Stuart Barrett '# VERSION........: 1.5 '# CREATED........: 26/04/11 '# LICENSE........: Freeware '# REQUIREMENTS...: '# '# DESCRIPTION....: Allows full management of AD users / groups and '# displays info surrounding other objects within AD '# '# NOTES..........: '# '# CUSTOMIZE......: '#============================================================================== '# REVISED BY.....: '# EMAIL..........: '# REVISION DATE..: '# REVISION NOTES.: '# '#============================================================================== '#============================================================================== Dim Dim Dim Dim Dim Dim Dim ort Dim strSortGroupDataList, intLastTable, strLastUserCreated Dim booOptimiseSearch, booCacheGroups, intTotalGroups Const Const Const Const Const Const ADS_UF_ACCOUNTDISABLE = &H02 ADS_UF_DONT_EXPIRE_PASSWD = &H10000 DOMAIN_PASSWORD_COMPLEX = &H1 SEC_IN_DAY = 86400 SEC_IN_MIN = 60 adVarChar = 200 strCompany, strCountry, strOffice, strDepartment, strFaxNo strDescription, strFirstName, strSurname, strDefaultEmail strDomain, strDNSDomain, strRootOU, intMaxPwdAge, booSearched booUserSort, booFirstNameSort, booSurnameSort booTitleSort, booEmailSort, strSortUserDataList, strSortPCDataList booPCNameSort, booPCDescSort, booPCOSSort, booPCSPSort booGroupNameSort, booGroupDescSort, booGroupTypeSort, booGroupEmailS

Const MaxCharacters = 255 Set objShell = CreateObject("WScript.Shell") Set UserDataList = CreateObject("ADOR.Recordset") Set PCDataList = CreateObject("ADOR.Recordset") Set GroupDataList = CreateObject("ADOR.Recordset") booSearched = 0 '#------------------------------------------------------------------------'# SUBROUTINE.....: PopulateLayout1() '# PURPOSE........: Shows AD info '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub PopulateLayout1() On Error Resume Next document.body.style.cursor = "wait" PauseScript(1) '#============================================================== ================ '# Get Domain Info '#============================================================== ================ Set objDomain = GetObject("WinNT://" & strDomain) Set objAdS = GetObject("LDAP://" & strDNSDomain) Err.Clear intLockoutThreshold = objAds.Get("lockoutThreshold") If Err.Number = 0 Then If intLockoutThreshold > 0 Then strLockoutThreshold = intLockoutThreshold & " at tempts" Else L1strLockoutThreshold.className = "redbo ld" strLockoutThreshold = "Never Lockout" End If Else L1strLockoutThreshold.className = "redbold" strLockoutThreshold = "Not Defined" Err.Clear End If Err.Clear intMaxPwdAgeSeconds = objDomain.Get("MaxPasswordAge") If Err.Number = 0 Then If intMaxPwdAgeSeconds > 0 Then intMaxPwdAge = intMaxPwdAgeSeconds / SEC_IN_DAY strMaxPwdAgeDays = intMaxPwdAge & " days" Else L1strMaxPwdAgeDays.className = "redbold" strMaxPwdAgeDays = "Never Expire" End If Else

L1strMaxPwdAgeDays.className = "redbold" strMaxPwdAgeDays = "Not Defined" Err.Clear End If Err.Clear intMinPwdAgeSeconds = objDomain.Get("MinPasswordAge") If Err.Number = 0 Then If intMinPwdAgeSeconds > 0 Then intMinPwdAge = intMinPwdAgeSeconds / SEC_IN_DAY strMinPwdAgeDays = intMinPwdAge & " days" Else L1strMinPwdAgeDays.className = "redbold" strMinPwdAgeDays = "Not Defined" End If Else L1strMinPwdAgeDays.className = "redbold" strMinPwdAgeDays = "Not Defined" Err.Clear End If Err.Clear intMinPwdLength = objAdS.Get("minPwdLength") If Err.Number = 0 Then strMinPwdLength = intMinPwdLength & " characters" Else L1strMinPwdLength.className = "redbold" strMinPwdLength = "Not Defined" Err.Clear End If Err.Clear intPwdHistoryLength = objAds.Get("pwdHistoryLength") If Err.Number = 0 Then strPwdHistoryLength = intPwdHistoryLength & " passwords" Else L1strPwdHistoryLength.className = "redbold" strPwdHistoryLength = "Not Defined" Err.Clear End If intPwdProperties = objAds.Get("pwdProperties") If (DOMAIN_PASSWORD_COMPLEX AND intPwdProperties) Then strPasswordComplex = "<span class=""greenbold"">Enabled< /span>" Else strPasswordComplex = "<span class=""redbold"">Di sabled</span>" End If intLockOutObservationWindowSeconds = objDomain.Get("LockoutObser vationInterval") If Err.Number = 0 Then intLockOutObservationWindowMinutes = intLockOutObservati onWindowSeconds / SEC_IN_MIN strLockOutObservationWindowMinutes = _ "Reset account lockout counter after " & intLockOutObser vationWindowMinutes & " minutes" Else

L1strLockOutObservationWindowMinutes.className = "redbold" strLockOutObservationWindowMinutes = _ "Reset account lockout counter policy not define d" End If intLockoutDurationSeconds = objDomain.Get("AutoUnlockInterval") If intLockoutDurationSeconds <> -1 Then intLockoutDurationMinutes = intLockOutDurationSeconds / SEC_IN_MIN strLockoutDurationMinutes = _ "The locked out account will be reset after " & intLocko utDurationMinutes & " minutes" Else L1strLockoutDurationMinutes.className = "redbold " strLockoutDurationMinutes = "Administrator must manually unlock locked accounts" End If booDisableCount = objShell.RegRead("HKCU\Software\SKB\ADManageme ntUtil\Setup\booDisableCount") If booDisableCount = 0 Then '#====================================================== ======================== '# Get AD Info '#====================================================== ======================== Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strRootOU & ">" strFilter = "(objectCategory=*)" strAttributes = "distinguishedName,sAMAccountName,whenCr eated,objectCategory" strQuery = strBase & ";" & strFilter & ";" & strAttribut es & ";subtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "There are no users in the specified OU ( " & strRootOU & "), or the OU has been entered " & _ "incorrectly. ", vbInformation, "AD Management Utility" Exit Sub End If

Do Until objRecordSet.EOF On Error Resume Next strDN = objRecordSet.Fields("distinguishedName") .Value arrCategory = Split(objRecordSet.Fields("objectC ategory").Value, ",") strCategory = arrCategory(0) Select Case LCase(strCategory) Case "cn=person" strUser = objRecordSet.Fields("s AMAccountName").Value dtmTempLastUserCreated = objReco rdSet.Fields("whenCreated").Value If dtmTempLastUserCreated > dtmL astUserCreated OR dtmLastUserCreated = "" Then dtmLastUserCreated = dtm TempLastUserCreated strLastUserCreated = str User End If If strUser <> "" AND NOT IsNull( strUser) Then intNumUsers = intNumUsers + 1 Case "cn=organizational-unit" intNumOUs = intNumOUs + 1 Case "cn=computer" intNumPCs = intNumPCs + 1 Case "cn=group" intNumGroups = intNumGroups + 1 Case "cn=domain-dns" intNumOUs = intNumOUs + 1 End Select objRecordSet.MoveNext Loop lngBiasKey = objShell.RegRead("HKLM\System\CurrentContro lSet\Control\" & _ "TimeZoneInformation\ActiveTimeBias") If (LCase(TypeName(lngBiasKey)) = "long") Then lngBias = lngBiasKey ElseIf (LCase(TypeName(lngBiasKey)) = "variant() ") Then lngBias = 0 For k = 0 To UBound(lngBiasKey) lngBias = lngBias + (lngBiasKey( k) * 256^k) Next End If dtmLastUserCreated = DateAdd("n", -lngBias, dtmLastUserC reated) L1strLastUserCreated.InnerHTML = strLastUserCreated & " (" & dtmLastUserCreated & ")" L1intNumOUs.InnerHTML = intNumOUs - 1 L1intNumUsers.InnerHTML = intNumUsers L1intNumGroups.InnerHTML = intNumGroups

L1intNumPCs.InnerHTML = intNumPCs L1strLastUserCreated.Title = "View / change user info fo r '" & strLastUserCreated & "'" L1intNumOUs.Title = "" L1intNumUsers.Title = "Show a list of all users in AD" L1intNumGroups.Title = "Show a list of all groups in AD" L1intNumPCs.Title = "Show a list of all computers in AD" L1strLastUserCreated.className = "spanlink" 'L1intNumOUs.className = "" L1intNumUsers.className = "spanlink" L1intNumGroups.className = "spanlink" L1intNumPCs.className = "spanlink" L1strLastUserCreated.onClick = ReloadLayoutUser(strLastU serCreated) L1intNumUsers.onClick = ShowTable(3) L1intNumGroups.onClick = ShowTable(2) L1intNumPCs.onClick = ShowTable(1) Else L1strLastUserCreated.InnerHTML = "n/a" L1intNumOUs.InnerHTML = "n/a" L1intNumUsers.InnerHTML = "n/a" L1intNumGroups.InnerHTML = "n/a" L1intNumPCs.InnerHTML = "n/a" L1strLastUserCreated.Title = "Not Available - ca n be changed in settings" L1intNumOUs.Title = "Not Available - can be chan ged in settings" L1intNumUsers.Title = "Not Available - can be ch anged in settings" L1intNumGroups.Title = "Not Available - can be c hanged in settings" L1intNumPCs.Title = "Not Available - can be chan ged in settings" L1strLastUserCreated.className = "" 'L1intNumOUs.className = "" L1intNumUsers.className = "" L1intNumGroups.className = "" L1intNumPCs.className = "" L1strLastUserCreated.onClick = "" L1intNumUsers.onClick = "" L1intNumGroups.onClick = "" L1intNumPCs.onClick = "" End If L1strDomain.InnerHTML = strDomain L1strDNSDomain.InnerHTML = strDNSDomain L1strLockoutThreshold.InnerHTML = strLockoutThreshold L1strMaxPwdAgeDays.InnerHTML = strMaxPwdAgeDays L1strMinPwdAgeDays.InnerHTML = strMinPwdAgeDays L1strMinPwdLength.InnerHTML = strMinPwdLength L1strPasswordComplex.InnerHTML = strPasswordComplex L1strPwdHistoryLength.InnerHTML = strPwdHistoryLength L1strLockOutObservationWindowMinutes.InnerHTML = strLockOutObser vationWindowMinutes L1strLockoutDurationMinutes.InnerHTML = strLockoutDurationMinute s document.body.style.cursor = "default" End Sub

'#------------------------------------------------------------------------'# SUBROUTINE.....: RefreshLayout1() '# PURPOSE........: Refresh data in AD Info menu '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub RefreshLayout1() ChangeLayout(loadingdiv) PopulateLayout1() ChangeLayout(layout1) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ShowTable(intType) '# PURPOSE........: Action triggered on opening List or changing '# drop down box '# ARGUMENTS......: intType = type of data to show '# EXAMPLE........: ShowTable(1) '# NOTES..........: Above example will show user table '#-------------------------------------------------------------------------Sub ShowTable(intType) CloseSearch(0) booShowListMsg = objShell.RegRead("HKCU\Software\SKB\ADManagemen tUtil\Setup\booShowListMsg") If booShowListMsg = 1 AND intType <> 0 Then ShowListPrompt = MsgBox("Viewing a list of all objects w ithin your organisation could take some time. " & _ vbCrLf & vbCrLf & "Do you wish to continue?", vb Question+vbYesNo, "AD Management Utility") If ShowListPrompt = vbNo Then Exit Sub End If Select Case intType Case 0 If intLastTable <> "" Then ShowTable(intLastTable) Else ShowTable(1) End If Exit Sub Case 1 If UserTableSpan.InnerHTML = "&nbsp;" OR UserTab leSpan.InnerHTML = "" Then ShowUserTable() Else ChangeTable(UserTableSpan) End If intLastTable = 1 UserTableSpan.className = "" Case 2 If PCTableSpan.InnerHTML = "&nbsp;" OR PCTableSp an.InnerHTML = "" Then ShowPCTable() Else ChangeTable(PCTableSpan)

End If intLastTable = 2 PCTableSpan.className = "" Case 3 If GroupTableSpan.InnerHTML = "&nbsp;" OR GroupT ableSpan.InnerHTML = "" Then ShowGroupTable() Else ChangeTable(GroupTableSpan) End If intLastTable = 3 GroupTableSpan.className = "" End Select L2TypeSelect.Value = intType End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ChangeTable(strSpan) '# PURPOSE........: Changes display to show table in app '# ARGUMENTS......: strSpan = html span to show '# EXAMPLE........: ChangeTable(UserTableSpan) '# NOTES..........: '#-------------------------------------------------------------------------Sub ChangeTable(strSpan) On Error Resume Next UserTableSpan.className = "hidden" PCTableSpan.className = "hidden" GroupTableSpan.className = "hidden" ChangeLayout(Layout2) strSpan.className = "" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: RefreshTableData() '# PURPOSE........: Refresh data in current table '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub RefreshTableData() UserTableSpan.className = "hidden" PCTableSpan.className = "hidden" GroupTableSpan.className = "hidden" PauseScript(1) Select Case L2TypeSelect.Value Case 1 UserTableSpan.InnerHTML = "" Set UserDataList = CreateObject("ADOR.Recordset" ) Case 2 PCTableSpan.InnerHTML = "" Set PCDataList = CreateObject("ADOR.Recordset") Case 3 GroupTableSpan.InnerHTML = "" Set GroupDataList = CreateObject("ADOR.Recordset ")

End Select ShowTable(0) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ShowUserTable() '# PURPOSE........: Performs initial pull of user table from AD '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ShowUserTable() document.body.style.cursor = "wait" strHTML = "<table id=""usertable"">" strHTML = strHTML & " <tr>" strHTML = strHTML & " <th style=""width:15%;"" title=" Username"" onClick=""ChangeUserSortOrder(1)"">" strHTML = strHTML & " User" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:15%;"" title=" First Name"" onClick=""ChangeUserSortOrder(2)"">" strHTML = strHTML & " First Name" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:15%;"" title=" Surname"" onClick=""ChangeUserSortOrder(3)"">" strHTML = strHTML & " Surname" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:20%;"" title=" Job Title"" onClick=""ChangeUserSortOrder(4)"">" strHTML = strHTML & " Job Title" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" title=" Email Address"" onClick=""ChangeUserSortOrder(5)"">" strHTML = strHTML & " Email Address" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:5%;"">" strHTML = strHTML & " &nbsp;" strHTML = strHTML & " </th>" strHTML = strHTML & " </tr>" Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strRootOU & ">" strFilter = "(&(objectclass=user)(objectcategory=person))" strAttributes = "sAMAccountName,givenName,sn,title,mail" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False

"Sort by

"Sort by

"Sort by

"Sort by

"Sort by

objCommand.Properties("Sort on") = "sAMAccountName" Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "There are no users in the specified OU (" & strD NSDomain & "), or the OU has been entered " & _ "incorrectly. ", vbInformation, "AD Management Utility" Exit Sub End If UserDataList.Fields.Append "sAMAccountName", adVarChar, MaxChara cters UserDataList.Fields.Append UserDataList.Fields.Append UserDataList.Fields.Append UserDataList.Fields.Append UserDataList.Open "givenName", adVarChar, MaxCharacters "sn", adVarChar, MaxCharacters "title", adVarChar, MaxCharacters "mail", adVarChar, MaxCharacters

Do Until objRecordSet.EOF On Error Resume Next strUser = objRecordSet.Fields("sAMAccountName").Value strFirstName = objRecordSet.Fields("givenName").Value strSurname = objRecordSet.Fields("sn").Value strTitle = objRecordSet.Fields("title").Value strEmail = objRecordSet.Fields("mail").Value If If If If IsNull(strFirstName) Then strFirstName = "" IsNull(strSurname) Then strSurname = "" IsNull(strTitle) Then strTitle = "" IsNull(strEmail) Then strEmail = ""

UserDataList.AddNew UserDataList("sAMAccountName") = strUser UserDataList("givenName") = strFirstName UserDataList("sn") = strSurname UserDataList("title") = strTitle UserDataList("mail") = strEmail UserDataList.Update If If If If strFirstName = "" Then strFirstName = "&nbsp;" strSurname = "" Then strSurname = "&nbsp;" strTitle = "" Then strTitle = "&nbsp" strEmail = "" Then strEmail = "&nbsp;"

objRecordSet.MoveNext strHTML = strHTML & "<tr>" strHTML = strHTML & "<td style=""word-break:break-al l;"">" strHTML = strHTML & "<span class=""spanlink"" style=""te xt-decoration:none;"" onClick=ReloadLayoutUser(""" & strUser & _ """) title=""Edit '" & strUser & "'"">" & strUser & "</s pan>" strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" strHTML = strHTML & strFirstName strHTML = strHTML & "</td>" strHTML = strHTML & "<td>"

strHTML = strHTML & strSurname strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" strHTML = strHTML & strTitle strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" If strEmail <> "&nbsp;" Then strHTML = strHTML & "<a href=""mailto:" & strEma il & """ title=""Send email to " & _ strEmail & """>" & strEmail & "</a>" Else strHTML = strHTML & "&nbsp;" End If strHTML = strHTML & "</td>" strHTML = strHTML & "<td class=""redbold"" style=""t ext-align:center;cursor:hand;"" " & _ "onClick=ShowL3UserInfo(""" & strUser & """) title=""Vie w User Account Control for '" & strUser & "'"">" strHTML = strHTML & "C" strHTML = strHTML & "</td>" strHTML = strHTML & "</tr>" Loop strHTML = strHTML & "</table>" UserTableSpan.InnerHTML = strHTML intLastTable = 1 document.body.style.cursor = "default" ChangeTable(UserTableSpan) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ShowPCTable() '# PURPOSE........: Performs initial pull of PC table from AD '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ShowPCTable() document.body.style.cursor = "wait" strHTML = "<table id=""nonusertable"">" strHTML = strHTML & " <tr>" strHTML = strHTML & " <th style=""width:15%;"" title=" Computer Name"" onClick=""ChangePCSortOrder(1)"">" strHTML = strHTML & " Name" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" title=" Description"" onClick=""ChangePCSortOrder(2)"">" strHTML = strHTML & " Description" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" title=" OS"" onClick=""ChangePCSortOrder(3)"">" strHTML = strHTML & " Operating System" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:25%;"" title=" Service Pack"" onClick=""ChangePCSortOrder(4)"">" strHTML = strHTML & " Service Pack" strHTML = strHTML & " </th>"

"Sort by

"Sort by

"Sort by

"Sort by

strHTML = strHTML & "

</tr>"

Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strRootOU & ">" strFilter = "(objectcategory=computer)" strAttributes = "name,description,operatingSystem,operatingSyste mServicePack" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False objCommand.Properties("Sort on") = "name" Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "There are no computers in the specified OU (" & strDNSDomain & "), or the OU has been entered " & _ "incorrectly. ", vbInformation, "AD Management Utility" Exit Sub End If PCDataList.Fields.Append "name", adVarChar, MaxCharacters PCDataList.Fields.Append "description", adVarChar, MaxCharacters PCDataList.Fields.Append "operatingSystem", adVarChar, MaxCharac ters PCDataList.Fields.Append "operatingSystemServicePack", adVarChar , MaxCharacters PCDataList.Open Do Until objRecordSet.EOF On Error Resume Next strPCName = objRecordSet.Fields("name").Value strOS = objRecordSet.Fields("operatingSystem").Value strServicePack = objRecordSet.Fields("operatingSystemSer vicePack").Value strPCTmpDesc = objRecordSet.Fields("description").Value If IsArray(strPCTmpDesc) Then For x = 0 To UBound(strPCTmpDesc) strPCDescription = strPCDescription & " " & strPCTmpDesc(x) Next End If If IsNull(strPCName) Then strPCName = "" If IsNull(strPCDescription) Then strPCDescription = "" If IsNull(strOS) Then strOS = "" If IsNull(strServicePack) OR _ InStr(LCase(strServicePack), "service") = 0 Then strServ

icePack = "" PCDataList.AddNew PCDataList("name") = strPCName PCDataList("description") = strPCDescription PCDataList("operatingSystem") = strOS PCDataList("operatingSystemServicePack") = strServicePac k PCDataList.Update If strPCName = "" Then strPCName = "&nbsp;" If strPCDescription = "" Then strPCDescription = "&nbsp; " If strOS = "" Then strOS = "&nbsp" If strServicePack = "" Then strServicePack = "&nbsp;" objRecordSet.MoveNext strHTML = strHTML & "<tr>" strHTML = strHTML & "<td style=""word-break:break-al l;"">" strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML Loop strHTML = strHTML & "</table>" PCTableSpan.InnerHTML = strHTML intLastTable = 2 document.body.style.cursor = "default" ChangeTable(PCTableSpan) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ShowGroupTable() '# PURPOSE........: Performs initial pull of group table from AD '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ShowGroupTable() document.body.style.cursor = "wait" strHTML = "<table id=""nonusertable1"">" strHTML = strHTML & " <tr>" strHTML = strHTML & " <th style=""width:20%;"" title=" "Sort by Group Name"" onClick=""ChangeGroupSortOrder(1)"">" = = = = = = = = = = = = strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML & & & & & & & & & & & & strPCName "</td>" "<td>" strPCDescription "</td>" "<td>" strOS "</td>" "<td>" strServicePack "</td>" "</tr>"

strPCDescription = ""

strHTML = strHTML & " Name" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" title=" "Sort by Description"" onClick=""ChangeGroupSortOrder(2)"">" strHTML = strHTML & " Description" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:20%;"" title=" "Sort by Group Type"" onClick=""ChangeGroupSortOrder(3)"">" strHTML = strHTML & " Group Type" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" title=" "Sort by Email Address"" onClick=""ChangeGroupSortOrder(4)"">" strHTML = strHTML & " Email Address" strHTML = strHTML & " </th>" strHTML = strHTML & " </tr>" Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strRootOU & ">" strFilter = "(objectcategory=group)" strAttributes = "name,description,groupType,mail,distinguishedNa me" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False objCommand.Properties("Sort on") = "name" Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "There are no groups in the specified OU (" & str DNSDomain & "), or the OU has been entered " & _ "incorrectly. ", vbInformation, "AD Management Utility" Exit Sub End If GroupDataList.Fields.Append "name", adVarChar, MaxCharacters GroupDataList.Fields.Append "description", adVarChar, MaxCharact ers GroupDataList.Fields.Append "groupType", adVarChar, MaxCharacter s GroupDataList.Fields.Append "security", adVarChar, MaxCharacters GroupDataList.Fields.Append "mail", adVarChar, MaxCharacters GroupDataList.Fields.Append "distinguishedName", adVarChar, MaxC haracters GroupDataList.Open Do Until objRecordSet.EOF On Error Resume Next

strGroupDN = objRecordSet.Fields("distinguishedName").Va lue strGroupName = objRecordSet.Fields("name").Value intGroupType = objRecordSet.Fields("groupType").Value strGroupEmail = objRecordSet.Fields("mail").Value strGroupTmpDesc = objRecordSet.Fields("description").Val ue If IsArray(strGroupTmpDesc) Then For x = 0 To UBound(strGroupTmpDesc) strGroupDescription = strGroupDescriptio n & " " & strGroupTmpDesc(x) Next End If Select Case intGroupType Case 2 strGroupType = "Global" strSecurity = "No" Case 4 strGroupType = "Domain Local" strSecurity = "No" Case 8 strGroupType = "Universal" strSecurity = "No" Case -2147483646 strGroupType = "Global Security" strSecurity = "Yes" Case -2147483644 strGroupType = "Local Security" strSecurity = "Yes" Case -2147483640 strGroupType = "Universal Security" strSecurity = "Yes" Case -2147483643 strGroupType = "Universal Security" strSecurity = "Yes" Case Else strGroupType = "Unknown" strSecurity = "No" End Select If IsNull(strGroupName) Then strGroupName = "" If IsNull(strGroupEmail) Then strGroupEmail = "" If IsNull(strGroupDescription) Then strGroupDescription = "" GroupDataList.AddNew GroupDataList("distinguishedName") = strGroupDN GroupDataList("name") = strGroupName GroupDataList("groupType") = strGroupType GroupDataList("security") = strSecurity GroupDataList("mail") = strGroupEmail GroupDataList("description") = strGroupDescription GroupDataList.Update If strGroupName = "" Then strGroupName = "&nbsp;" If strGroupDescription = "" Then strGroupDescription = " &nbsp;" If strGroupType = "" Then strGroupType = "&nbsp" If strGroupEmail = "" Then strGroupEmail = "&nbsp;"

strGroupDN = Replace(strGroupDN, "'", "{}") strGroupDN = Replace(strGroupDN, Chr(34), "||") objRecordSet.MoveNext strHTML = strHTML & "<tr>" strHTML = strHTML & "<td style=""word-break:break-al l;"">" strHTML = strHTML & "<span class=""spanlink"" style=""te xt-decoration:none;"" onClick=""GetGroupMembers('" & _ strGroupDN & "')"" title=""Edit '" & strGroupName & "'"" >" & strGroupName & "</span>" strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" strHTML = strHTML & strGroupDescription strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" strHTML = strHTML & strGroupType strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" If strGroupEmail <> "&nbsp;" Then strHTML = strHTML & "<a href=""mailto:" & strGro upEmail & """ title=""Send email to " & _ strGroupEmail & """>" & strGroupEmail & "</a>" Else strHTML = strHTML & "&nbsp;" End If strHTML = strHTML & "</td>" strHTML = strHTML & "</tr>" strGroupDescription = "" Loop strHTML = strHTML & "</table>" GroupTableSpan.InnerHTML = strHTML intLastTable = 3 document.body.style.cursor = "default" ChangeTable(GroupTableSpan) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: GetGroupMembers(strDN) '# PURPOSE........: Action performed on opening Group link in list '# ARGUMENTS......: strDN = Full DN of group '# EXAMPLE........: GetGroupMembers("cn=Test,ou=Groups,dc=Acme,dc=Gr oup") '# NOTES..........: '#-------------------------------------------------------------------------Sub GetGroupMembers(strDN) strDN = Replace(strDN, "{}", "'") strDN = Replace(strDN, "||", Chr(34)) ResetLayoutGroup() GroupSelect.Focus() For Each objMember In GroupSelect

If InStr(LCase(objMember.Value), LCase(strDN)) > 0 Then objMember.Selected = True Next ShowMembers() End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: RetrieveUserTable() '# PURPOSE........: Shows user table as stored in data list, also '# handles sorting of table '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub RetrieveUserTable() document.body.style.cursor = "wait" UserDataList.Sort = strSortUserDataList strHTML = "<table id=""usertable"">" strHTML = strHTML & " <tr>" strHTML = strHTML & " <th style=""width:15%;"" title=" Username"" onClick=""ChangeUserSortOrder(1)"">" strHTML = strHTML & " User" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:15%;"" title=" First Name"" onClick=""ChangeUserSortOrder(2)"">" strHTML = strHTML & " First Name" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:15%;"" title=" Surname"" onClick=""ChangeUserSortOrder(3)"">" strHTML = strHTML & " Surname" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:20%;"" title=" Job Title"" onClick=""ChangeUserSortOrder(4)"">" strHTML = strHTML & " Job Title" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" title=" Email Address"" onClick=""ChangeUserSortOrder(5)"">" strHTML = strHTML & " Email Address" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:5%;"">" strHTML = strHTML & " &nbsp;" strHTML = strHTML & " </th>" strHTML = strHTML & " </tr>" Do Until UserDataList.EOF strUser = UserDataList.Fields("sAMAccountName").Value strFirstName = UserDataList.Fields("givenName").Value strSurname = UserDataList.Fields("sn").Value strTitle = UserDataList.Fields("title").Value strEmail = UserDataList.Fields("mail").Value If If If If strFirstName = "" Then strFirstName = "&nbsp;" strSurname = "" Then strSurname = "&nbsp;" strTitle = "" Then strTitle = "&nbsp" strEmail = "" Then strEmail = "&nbsp;"

"Sort by

"Sort by

"Sort by

"Sort by

"Sort by

UserDataList.MoveNext

strHTML = strHTML & "<tr>" strHTML = strHTML & "<td style=""word-break:break-al l;"">" strHTML = strHTML & "<span class=""spanlink"" style=""te xt-decoration:none;"" onClick=ReloadLayoutUser(""" & strUser & _ """) title=""Edit '" & strUser & "'"">" & strUser & "</s pan>" strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" strHTML = strHTML & strFirstName strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" strHTML = strHTML & strSurname strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" strHTML = strHTML & strTitle strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" If strEmail <> "&nbsp;" Then strHTML = strHTML & "<a href=""mailto:" & strEma il & """ title=""Send email to " & _ strEmail & """>" & strEmail & "</a>" Else strHTML = strHTML & "&nbsp;" End If strHTML = strHTML & "</td>" strHTML = strHTML & "<td class=""redbold"" style=""t ext-align:center;cursor:hand;"" " & _ "onClick=ShowL3UserInfo(""" & strUser & """) title=""Vie w User Account Control for '" & strUser & "'"">" strHTML = strHTML & "C" strHTML = strHTML & "</td>" strHTML = strHTML & "</tr>" Loop strHTML = strHTML & "</table>" UserTableSpan.InnerHTML = strHTML document.body.style.cursor = "default" ChangeTable(UserTableSpan) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: RetrievePCTable() '# PURPOSE........: Shows PC table as stored in data list, also '# handles sorting of table '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub RetrievePCTable() document.body.style.cursor = "wait" PCDataList.Sort = strSortPCDataList strHTML = "<table id=""nonusertable"">" strHTML = strHTML & " <tr>" strHTML = strHTML & " <th style=""width:15%;"" title=" "Sort by Computer Name"" onClick=""ChangePCSortOrder(1)"">"

strHTML = strHTML & " Name" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" title=" "Sort by Description"" onClick=""ChangePCSortOrder(2)"">" strHTML = strHTML & " Description" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" title=" "Sort by OS"" onClick=""ChangePCSortOrder(3)"">" strHTML = strHTML & " Operating System" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:25%;"" title=" "Sort by Service Pack"" onClick=""ChangePCSortOrder(4)"">" strHTML = strHTML & " Service Pack" strHTML = strHTML & " </th>" strHTML = strHTML & " </tr>" Do Until PCDataList.EOF strPCName = PCDataList("name") strPCDescription = PCDataList("description") strOS = PCDataList("operatingSystem") strServicePack = PCDataList("operatingSystemServicePack" ) If strPCName = "" Then strPCName = "&nbsp;" If strPCDescription = "" Then strPCDescription = "&nbsp; " If strOS = "" Then strOS = "&nbsp" If strServicePack = "" Then strServicePack = "&nbsp;" PCDataList.MoveNext strHTML = strHTML & "<tr>" strHTML = strHTML & "<td style=""word-break:break-al l;"">" strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML Loop strHTML = strHTML & "</table>" PCTableSpan.InnerHTML = strHTML document.body.style.cursor = "default" ChangeTable(PCTableSpan) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: '# RetrieveGroupTable() Shows group table as stored in data list, also handles sorting of table = = = = = = = = = = = = strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML strHTML & & & & & & & & & & & & strPCName "</td>" "<td>" strPCDescription "</td>" "<td>" strOS "</td>" "<td>" strServicePack "</td>" "</tr>"

'# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub RetrieveGroupTable() document.body.style.cursor = "wait" GroupDataList.Sort = strSortGroupDataList strHTML = "<table id=""nonusertable1"">" strHTML = strHTML & " <tr>" strHTML = strHTML & " <th style=""width:20%;"" Group Name"" onClick=""ChangeGroupSortOrder(1)"">" strHTML = strHTML & " Name" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" Description"" onClick=""ChangeGroupSortOrder(2)"">" strHTML = strHTML & " Description" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:20%;"" Group Type"" onClick=""ChangeGroupSortOrder(3)"">" strHTML = strHTML & " Group Type" strHTML = strHTML & " </th>" strHTML = strHTML & " <th style=""width:30%;"" Email Address"" onClick=""ChangeGroupSortOrder(4)"">" strHTML = strHTML & " Email Address" strHTML = strHTML & " </th>" strHTML = strHTML & " </tr>"

title="

"Sort by

title="

"Sort by

title="

"Sort by

title="

"Sort by

Do Until GroupDataList.EOF strGroupName = GroupDataList("name").Value strGroupType = GroupDataList("groupType").Value strGroupEmail = GroupDataList("mail").Value strGroupDescription = GroupDataList("description").Value If strGroupName = "" Then strGroupName = "&nbsp;" If strGroupDescription = "" Then strGroupDescription = " &nbsp;" If strGroupType = "" Then strGroupType = "&nbsp" If strGroupEmail = "" Then strGroupEmail = "&nbsp;" GroupDataList.MoveNext strHTML = strHTML & "<tr>" strHTML = strHTML & "<td style=""word-break:break-al l;"">" strHTML = strHTML & "<span class=""spanlink"" style=""te xt-decoration:none;"" onClick=""GetGroupMembers('" & _ strGroupDN & "')"" title=""Edit '" & strGroupName & "'"" >" & strGroupName & "</span>" strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" strHTML = strHTML & strGroupDescription strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" strHTML = strHTML & strGroupType strHTML = strHTML & "</td>" strHTML = strHTML & "<td>" If strGroupEmail <> "&nbsp;" Then strHTML = strHTML & "<a href=""mailto:" & strGro upEmail & """ title=""Send email to " & _

strGroupEmail & """>" & strGroupEmail & "</a>" Else strHTML = strHTML & "&nbsp;" End If strHTML = strHTML & strHTML = strHTML & Loop strHTML = strHTML & "</table>" GroupTableSpan.InnerHTML = strHTML document.body.style.cursor = "default" ChangeTable(GroupTableSpan) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ExportDetails() '# PURPOSE........: Export the required AD info '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ExportDetails() On Error Resume Next Const xlLeft = -4131 Const xlContinuous = 1 Const xlSolid = 1 Const xlThin = 2 Const xlAutomatic = -4105 Const xlCenter = -4108 Const xlLandscape = 2 Set objFSO = CreateObject("Scripting.FileSystemObject") strTemp = objShell.ExpandEnvironmentStrings("%TEMP%") strHTMLTempDir = Replace(LCase(strTemp), "c:", "file:///c:") strHTMLTempDir = Replace(strHTMLTempDir, "\", "/") Select Case L2TypeSelect.Value Case 1 intTotal = L1intNumUsers.InnerHTML strType = "User" If UserExportOptionsSpan.className = "hidden" Th en UserExportOptionsSpan.className = "" L2TypeSelect.Disabled = True ExportSelect.Disabled = True Exit Sub Else UserExportOptionsSpan.className = "hidden" L2TypeSelect.Disabled = False ExportSelect.Disabled = False End If Case 2 intTotal = L1intNumPCs.InnerHTML strType = "Computer" Case 3 intTotal = L1intNumGroups.InnerHTML "</td>" "</tr>"

strType = "Group" End Select Select Case ExportSelect.Value Case 1 Set objFile = objFSO.CreateTextFile(strTemp & "\ " & strType & "List.csv",True) objFile.WriteLine strType & " List" objFile.WriteLine "" objFile.WriteLine "Total " & strType & "s: " & i ntTotal objFile.WriteLine "" Select Case L2TypeSelect.Value Case 2 objFile.WriteLine "Computer Name ,Description,Operating System,Service Pack" Case 3 objFile.WriteLine "Group Name,De scription,Type,Security Group,Email" End Select Case 2 strExcelPath = objShell.RegRead("HKLM\SOFTWARE\M icrosoft\Windows\CurrentVersion\App Paths\excel.exe\") If strExcelPath = "" Then MsgBox "Unable to export. Excel does not appear to be installed.", vbExclamation, "AD Management Utility" Exit Sub End If Set objExcel = CreateObject("Excel.Application") objExcel.Visible = False Set objWorkBook = objExcel.WorkBooks.Add Set objWorksheet = objWorkbook.Worksheets(1) objExcel.DisplayAlerts = False For i = 1 to 3 objWorkbook.Worksheets(2).Delete Next objExcel.DisplayAlerts = True objWorksheet.Name = strType & " List" objWorkSheet.Cells(1, 1) = strType & " List" objWorkSheet.Cells(3, 1) = "Total " & strType & "s: " & intTotal intStartRow = 6 Select Case L2TypeSelect.Value Case 1 objWorkSheet.Cells(5, 1) = "User name" Case 2 objWorkSheet.Cells(5, 1) = "Comp uter Name" objWorkSheet.Cells(5, 2) = "Desc ription" objWorkSheet.Cells(5, 3) = "Oper ating System" objWorkSheet.Cells(5, 4) = "Serv ice Pack"

Case 3 objFile.WriteLine "Group Name,De scription,Type,Security Group,Email" objWorkSheet.Cells(5, 1) = "Grou p Name" objWorkSheet.Cells(5, 2) = "Desc ription" objWorkSheet.Cells(5, 3) = "Type " objWorkSheet.Cells(5, 4) = "Secu rity Group" objWorkSheet.Cells(5, 5) = "Emai l" End Select Case 3 Set objFile = objFSO.CreateTextFile(strTemp & "\ " & strType & "List.htm",True) objFile.WriteLine "<style type=""text/css"">" objFile.WriteLine "body{background-color:#CEF0FF ;font-family: ""trebuchet ms"", calibri, helvetica, sans-serif, ""Times New Roma n"";}" objFile.WriteLine "table.export{border-width:1px ;border-spacing:1px;border-style:solid;border-color:gray;border-collapse:collaps e;}" objFile.WriteLine "table.export th{border-width: 1px;padding:1px;border-style:solid;border-color:gray;padding:2px 7px 2px 7px;}" objFile.WriteLine "table.export td{border-width: 1px;padding:1px;border-style:dotted;border-color:gray;padding:2px 7px 2px 7px;}" objFile.WriteLine ".backtotop a {font-size:0.9em ;}" objFile.WriteLine "</style>" objFile.WriteLine "<div style=""font-weight:bold ;""><a name =""top"">" & strType & " List</a><p>" objFile.WriteLine "Total " & strType & "s: " & i ntTotal & "<p></div>" objFile.WriteLine "<table class=""export"">" Select Case L2TypeSelect.Value Case 2 objFile.WriteLine " objFile.WriteLine " <th style=""text-align:left;"">" objFile.WriteLine " Computer Name" objFile.WriteLine " </th>" objFile.WriteLine " <th style=""text-align:left;"">" objFile.WriteLine " Description" objFile.WriteLine " </th>" objFile.WriteLine " <th style=""text-align:left;"">" objFile.WriteLine " Operating System" objFile.WriteLine " </th>" objFile.WriteLine " <th style=""text-align:left;"">"

<tr>"

objFile.WriteLine " Service Pack" objFile.WriteLine " </th>" objFile.WriteLine " Case 3 objFile.WriteLine " objFile.WriteLine " <th style=""text-align:left;"">" objFile.WriteLine " Group Name" objFile.WriteLine " </th>" objFile.WriteLine " <th style=""text-align:left;"">" objFile.WriteLine " Description" objFile.WriteLine " </th>" objFile.WriteLine " <th style=""text-align:left;"">" objFile.WriteLine " Type" objFile.WriteLine " </th>" objFile.WriteLine " <th style=""text-align:left;"">" objFile.WriteLine " Security Group" objFile.WriteLine " </th>" objFile.WriteLine " <th style=""text-align:left;"">" objFile.WriteLine " Email" objFile.WriteLine " </th>" objFile.WriteLine " End Select End Select Select Case L2TypeSelect.Value Case 1 Set objConnection = CreateObject("ADODB.Connecti on") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strRootOU & ">" strFilter = "(&(objectclass=user)(objectcategory =person))" strAttributes = "sAMAccountName,displayName,give nName,sn,title," & _ "telephoneNumber,mobile,facsimileTelepho neNumber,mail,description," & _ "company,streetAddress,l,st,postalCode,c </tr>" <tr>" </tr>"

o,physicalDeliveryOfficeName," & _ "department,distinguishedName" strQuery = strBase & ";" & strFilter & ";" & str Attributes & ";subtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False objCommand.Properties("Sort on") = "sAMAccountNa me" Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "There are no users in the specif ied OU (" & strDNSDomain & "), or the OU has been entered " & _ "incorrectly. ", vbInformation, "AD Man agement Utility" Exit Sub End If Do Until objRecordSet.EOF On Error Resume Next strDNX = objRecordSet.Fields("distinguis hedName").Value strUserX = objRecordSet.Fields("sAMAccou ntName").Value strDispNameX = objRecordSet.Fields("disp layName").Value strFirstNameX = objRecordSet.Fields("giv enName").Value strSurnameX = objRecordSet.Fields("sn"). Value strTitleX = objRecordSet.Fields("title") .Value strTelephoneNumberX = objRecordSet.Field s("telephoneNumber").Value strMobileX = objRecordSet.Fields("mobile ").Value strFaxNoX = objRecordSet.Fields("facsimi leTelephoneNumber").Value strEmailX = objRecordSet.Fields("mail"). Value strCompanyX = objRecordSet.Fields("compa ny").Value strStreetAddressX = objRecordSet.Fields( "streetAddress").Value strCityX = objRecordSet.Fields("l").Valu e strCountyX = objRecordSet.Fields("st").V alue strPostcodeX = objRecordSet.Fields("post alCode").Value strCountryX = objRecordSet.Fields("co"). Value strOfficeX = objRecordSet.Fields("physic alDeliveryOfficeName").Value strDepartmentX = objRecordSet.Fields("de partment").Value

If UserExportForm.cbxDescriptionX.Checke d Then Set objUser = GetObject("LDAP:// " & strDNX) strDescriptionX = objUser.Descri ption End If If ExportSelect.Value = 1 Then strDispNameX = EncodeCsv(strDisp NameX) strFirstNameX = EncodeCsv(strFir stNameX) strSurnameX = EncodeCsv(strSurna meX) strTitleX = EncodeCsv(strTitleX) strTelephoneNumberX = EncodeCsv( strTelephoneNumberX) strMobileX = EncodeCsv(strMobile X) strFaxNoX = EncodeCsv(strFaxNoX) strEmailX = EncodeCsv(strEmailX) strDescriptionX = EncodeCsv(strD escriptionX) strCompanyX = EncodeCsv(strCompa nyX) strStreetAddressX = EncodeCsv(st rStreetAddressX) strCityX = EncodeCsv(strCityX) strCountyX = EncodeCsv(strCounty X) strPostcodeX = EncodeCsv(strPost codeX) strCountryX = EncodeCsv(strCount ryX) strOfficeX = EncodeCsv(strOffice X) strDepartmentX = EncodeCsv(strDe partmentX) strDNX = EncodeCsv(strDNX) End If UserExportForm.cbxDispNameX.Value = "Dis play Name,||" & strDispNameX UserExportForm.cbxFirstNameX.Value = "Fi rst Name,||" & strFirstNameX UserExportForm.cbxSurnameX.Value = "Surn ame,||" & strSurnameX UserExportForm.cbxTitleX.Value = "Title, ||" & strTitleX UserExportForm.cbxTelephoneNumberX.Value = "Telephone,||" & strTelephoneNumberX UserExportForm.cbxMobileX.Value = "Mobil e,||" & strMobileX UserExportForm.cbxFaxNoX.Value = "Fax No ,||" & strFaxNoX UserExportForm.cbxEmailX.Value = "Email, ||" & strEmailX UserExportForm.cbxDescriptionX.Value = "

Description,||" & strDescriptionX UserExportForm.cbxCompanyX.Value = "Comp any,||" & strCompanyX UserExportForm.cbxStreetAddressX.Value = "Street Address,||" & strStreetAddressX UserExportForm.cbxCityX.Value = "City,|| " & strCityX UserExportForm.cbxCountyX.Value = "Count y,||" & strCountyX UserExportForm.cbxPostcodeX.Value = "Pos tcode,||" & strPostcodeX UserExportForm.cbxCountryX.Value = "Coun try,||" & strCountryX UserExportForm.cbxOfficeX.Value = "Offic e,||" & strOfficeX UserExportForm.cbxDepartmentX.Value = "D epartment,||" & strDepartmentX UserExportForm.cbxDNX.Value = "DN,||" & strDNX objRecordSet.MoveNext Select Case ExportSelect.Value Case 1 strCsvUserHead = "Userna me," strCSV = strCSV & strUse rX & "," For Each Checkbox In Use rExportForm If Checkbox.Chec ked = True AND Checkbox.Disabled = False Then arrValue = Split(Checkbox.Value, "||") strLabel = arrValue(0) strData = arrValue(1) If strLa bel <> "Done" Then strData = strData & "," strCsvUserHead = strCsvUserHead & strLabel End If Else str Data = "" End If strCSV = strCSV & strData strData = "" Next strCSV = strCSV & vbCrLf Case 2 j = 2 objWorkSheet.Cells(intSt artRow, 1) = strUserX

For Each Checkbox In Use rExportForm If Checkbox.Chec ked = True AND Checkbox.Disabled = False Then arrValue = Split(Checkbox.Value, ",||") strLabel = arrValue(0) strData = arrValue(1) If strLa bel <> "Done" Then objWorkSheet.Cells(5, j) = strLabel objWorkSheet.Cells(intStartRow, j) = strData j = j + 1 End If End If strCSV = strCSV & strData strData = "" Next intStartRow = intStartRo w + 1 Case 3 strHTMLUserHead = "<tr>< th style=""text-align:left;"">Username</th>" strHTML = strHTML & "<tr ><td>" & strUserX & "</td>" For Each Checkbox In Use rExportForm If Checkbox.Chec ked = True AND Checkbox.Disabled = False Then arrValue = Split(Checkbox.Value, ",||") strLabel = arrValue(0) strData = arrValue(1) If strLa bel <> "Done" Then If strLabel = "Email" AND InStr(strData, "@") > 0 Then strData = "<td><a href=""mailto:" & strData & """ title=""Send email to " & _ strData & """>" & strData & "</a></td>" Else strData = "<td>" & strData & "</td>" End If strHTMLUserHead = strHTMLUserHead & _ "<th style=""text-align:left;"">" & strLabel & "</th>" End If

Else str Data = "" End If strHTML = strHTM L & strData strData = "" Next strHTMLUserHead = strHTM LUserHead & "</tr>" strHTML = strHTML & "</t r>" End Select Loop Case 2 PCDataList.Sort = "name ASC" Do Until PCDataList.EOF strPCName = PCDataList.Fields("name").Va lue strOS = PCDataList.Fields("operatingSyst em").Value strServicePack = PCDataList.Fields("oper atingSystemServicePack").Value strPCDescription = PCDataList.Fields("de scription").Value Select Case ExportSelect.Value Case 1 strPCDescription = Repla ce(strPCDescription, ",", ".") strCSV = strCSV & strPCN ame & "," & _ strPCDescription & "," & strOS & "," & _ strServicePack & vbCrLf Case 2 objWorkSheet.Cells(intSt artRow, 1) = strPCName objWorkSheet.Cells(intSt artRow, 2) = strPCDescription objWorkSheet.Cells(intSt artRow, 3) = strOS objWorkSheet.Cells(intSt artRow, 4) = strServicePack intStartRow = intStartRo w + 1 Case 3 objFile.WriteLine " <tr>" objFile.WriteLine " <td>" objFile.WriteLine " " & strPCName objFile.WriteLine " </td>" objFile.WriteLine " <td>" objFile.WriteLine " " & strPCDescription

objFile.WriteLine " </td>" objFile.WriteLine " <td>" objFile.WriteLine " " & strOS objFile.WriteLine " </td>" objFile.WriteLine " <td>" objFile.WriteLine " " & strServicePack objFile.WriteLine " </td>" objFile.WriteLine " </tr>" End Select PCDataList.moveNext Loop Case 3 GroupDataList.Sort = "name ASC" Do Until GroupDataList.EOF strGroupName = GroupDataList.Fields("nam e").Value strGroupType = GroupDataList.Fields("gro upType").Value strSecurity = GroupDataList.Fields("secu rity").Value strGroupEmail = GroupDataList.Fields("ma il").Value strGroupDescription = GroupDataList.Fiel ds("description").Value If IsNull(strGroupName) Then strGroupNam e = "" If IsNull(strGroupEmail) Then strGroupEm ail = "" If IsNull(strGroupDescription) Then strG roupDescription = "" Select Case ExportSelect.Value Case 1 strGroupDescription = Re place(strGroupDescription, ",", ".") strCSV = strCSV & strGro upName & "," & _ strGroupDescription & ", " & strGroupType & "," & _ strSecurity & "," & strG roupEmail & vbCrLf Case 2 objWorkSheet.Cells(intSt artRow, 1) = strGroupName objWorkSheet.Cells(intSt artRow, 2) = strGroupDescription objWorkSheet.Cells(intSt artRow, 3) = strGroupType objWorkSheet.Cells(intSt

artRow, 4) = strSecurity objWorkSheet.Cells(intSt artRow, 5) = strGroupEmail intStartRow = intStartRo w + 1 Case 3 objFile.WriteLine " <tr>" objFile.WriteLine " <td>" objFile.WriteLine " " & strGroupName objFile.WriteLine " </td>" objFile.WriteLine " <td>" objFile.WriteLine " " & strGroupDescription objFile.WriteLine " </td>" objFile.WriteLine " <td>" objFile.WriteLine " " & strGroupType objFile.WriteLine " </td>" objFile.WriteLine " <td>" objFile.WriteLine " " & strSecurity objFile.WriteLine " </td>" objFile.WriteLine " <td>" objFile.WriteLine " <a href=""mailto:" & strGroupEmail & """ title=""Send email to " & _ strGroupEmail & """>" & strGroupEmail & "</a>" objFile.WriteLine " </td>" objFile.WriteLine " </tr>" End Select GroupDataList.moveNext Loop End Select Select Case ExportSelect.Value Case 1 objFile.WriteLine strCsvUserHead objFile.WriteLine strCSV objFile.Close Set objFile = Nothing objShell.Run strTemp & "\" & strType & "List.csv " Case 2 objWorksheet.Range("A6").Select objExcel.ActiveWindow.FreezePanes = "True" objWorksheet.Range("A1").Select

objWorkSheet.Columns("A:Z").EntireColumn.AutoFit Select Case L2TypeSelect.Value Case 1 Set objRangeH = objWorkSheet.Ran ge("A5:" & Chr(j+63) & "5") Set objRange2 = objWorkSheet.Ran ge("A5:" & Chr(j+63) & intStartRow - 1) Set objRange3 = objWorkSheet.Ran ge("D:D") With objRange3 .ColumnWidth = 35 .WrapText = True .EntireRow.Autofit End With Case 2 Set objRangeH = objWorkSheet.Ran ge("A5:D5") Set objRange2 = objWorkSheet.Ran ge("A5:D" & intStartRow - 1) Set objRange3 = objWorkSheet.Ran ge("B:B") Set objRange4 = objWorkSheet.Ran ge("D:D") With objRange3 .ColumnWidth = 35 .WrapText = True .EntireRow.Autofit End With objRange4.ColumnWidth = "14.43" Case 3 Set objRangeH = objWorkSheet.Ran ge("A5:E5") Set objRange2 = objWorkSheet.Ran ge("A5:E" & intStartRow - 1) Set objRange3 = objWorkSheet.Ran ge("B:B") Set objRange4 = objWorkSheet.Ran ge("D:D") With objRange3 .ColumnWidth = 35 .WrapText = True .EntireRow.Autofit End With With objRange4 .ColumnWidth = 9.86 .WrapText = True .EntireRow.Autofit .HorizontalAlignment = x lCenter End With End Select Set objRange = objWorkSheet.Range("A1:Z5") Set objRange1 = objWorkSheet.Range("A:A") With objRangeH .WrapText = True

.AutoFilter .Interior.ColorIndex = 15 .Interior.Pattern = xlSolid .RowHeight = 25.5 End With objRange.Font.Bold = True objRange1.HorizontalAlignment = xlLeft With objRange2 .Borders.LineStyle = xlContinuous .Borders.Weight = xlThin .Borders.ColorIndex = xlAutomatic End With With objExcel.ActiveSheet.PageSetup .PrintTitleRows = "$5:$5" .Orientation = xlLandscape .PrintArea = "" .FitToPagesWide = 1 .FitToPagesTall = False .Zoom = False End With objExcel.DisplayAlerts = False objExcel.ActiveWorkbook.SaveAs(strTemp & "\" & s trType & "List.xls") objExcel.Visible = True Set objExcel = Nothing Case 3 objFile.WriteLine strHTMLUserHead objFile.WriteLine strHTML objFile.WriteLine "</table>" objFile.WriteLine "<p class=""backtotop""><a hre f=""" & strHTMLTempDir & "/" & strType & "List.htm#top"">[..back to top..]</a></ p>" objFile.Close Set objFile = Nothing objShell.Run strTemp & "\" & strType & "List.htm " End Select ExportSelect.Value = 0 For Each checkbox In UserExportForm If checkbox.Disabled = False Then checkbox.Checked = False End If Next End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: CheckUserExport(booCheck) '# PURPOSE........: Checks / unchecks export checkboxes '# ARGUMENTS......: booCheck = boolean value for whether to check '# EXAMPLE........: CheckUserExport(1) '# NOTES..........: Above example would check boxes '#--------------------------------------------------------------------------

Sub CheckUserExport(booCheck) For Each checkbox In UserExportForm If booCheck = 1 Then checkbox.Checked = True Else If checkbox.Disabled = False Then checkbox.Checked = False End If End If Next End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: CloseExportScreen() '# PURPOSE........: Closes Export box '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub CloseExportScreen() L2TypeSelect.Disabled = False ExportSelect.Disabled = False CheckUserExport(0) ExportSelect.Value = 0 UserExportOptionsSpan.className = "hidden" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: '# ARGUMENTS......: d '# EXAMPLE........: ChangeUserSortOrder(1) '# NOTES..........: '#-------------------------------------------------------------------------Sub ChangeUserSortOrder(intChoice) Select Case intChoice Case 1 If booUserSort = 1 Then strSortUserDataList = "sAMAccountName AS C" ResetSortOrders(1) booUserSort = 2 Else strSortUserDataList = "sAMAccoun tName DESC" ResetSortOrders(1) End If Case 2 If booFirstNameSort = 1 Then strSortUserDataList = "givenName ASC" ResetSortOrders(1) booFirstNameSort = 2 Else strSortUserDataList = "givenName DESC" ResetSortOrders(1) End If ChangeUserSortOrder(intChoice) Changes the sort order on clicking column header intChoice = number representing chosen sort fiel

Case 3 If booSurnameSort = 1 Then strSortUserDataList = "sn ASC" ResetSortOrders(1) booSurnameSort = 2 Else strSortUserDataList = "sn DESC" ResetSortOrders(1) End If Case 4 If booTitleSort = 1 Then strSortUserDataList = "title ASC" ResetSortOrders(1) booTitleSort = 2 Else strSortUserDataList = "title DES C" ResetSortOrders(1) End If Case 5 If booEmailSort = 1 Then strSortUserDataList = "mail ASC" ResetSortOrders(1) booEmailSort = 2 Else strSortUserDataList = "mail DESC " ResetSortOrders(1) End If End Select RetrieveUserTable() End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: '# ARGUMENTS......: d '# EXAMPLE........: ChangePCSortOrder(1) '# NOTES..........: '#-------------------------------------------------------------------------Sub ChangePCSortOrder(intChoice) Select Case intChoice Case 1 If booPCNameSort = 1 Then strSortPCDataList = "name ASC" ResetSortOrders(2) booPCNameSort = 2 Else strSortPCDataList = "name DESC" ResetSortOrders(2) End If Case 2 If booPCDescSort = 1 Then strSortPCDataList = "description ASC" ResetSortOrders(2) booPCDescSort = 2 Else strSortPCDataList = "description ChangePCSortOrder(intChoice) Changes the sort order on clicking column header intChoice = number representing chosen sort fiel

DESC" ResetSortOrders(2) End If Case 3 If booPCOSSort = 1 Then strSortPCDataList = "operatingSystem ASC " ResetSortOrders(2) booPCOSSort = 2 Else strSortPCDataList = "operatingSy stem DESC" ResetSortOrders(2) End If Case 4 If booPCSPSort = 1 Then strSortPCDataList = "operatingSystemServ icePack ASC" ResetSortOrders(2) booPCSPSort = 2 Else strSortPCDataList = "operatingSy stemServicePack DESC" ResetSortOrders(2) End If End Select RetrievePCTable() End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: '# ARGUMENTS......: d '# EXAMPLE........: ChangeGroupSortOrder(1) '# NOTES..........: '#-------------------------------------------------------------------------Sub ChangeGroupSortOrder(intChoice) Select Case intChoice Case 1 If booGroupNameSort = 1 Then strSortGroupDataList = "name ASC" ResetSortOrders(3) booGroupNameSort = 2 Else strSortGroupDataList = "name DES C" ResetSortOrders(3) End If Case 2 If booGroupDescSort = 1 Then strSortGroupDataList = "description ASC" ResetSortOrders(3) booGroupDescSort = 2 Else strSortGroupDataList = "descript ion DESC" ResetSortOrders(3) End If ChangeGroupSortOrder(intChoice) Changes the sort order on clicking column header intChoice = number representing chosen sort fiel

Case 3 If booGroupTypeSort = 1 Then strSortGroupDataList = "groupType ASC" ResetSortOrders(3) booGroupTypeSort = 2 Else strSortGroupDataList = "groupTyp e DESC" ResetSortOrders(3) End If Case 4 If booGroupEmailSort = 1 Then strSortGroupDataList = "mail ASC" ResetSortOrders(3) booGroupEmailSort = 2 Else strSortGroupDataList = "mail DES C" ResetSortOrders(3) End If End Select RetrieveGroupTable() End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ResetSortOrders(intChoice) '# PURPOSE........: Resets the sort order flags to default '# ARGUMENTS......: intChoice = table orders to reset '# EXAMPLE........: ResetSortOrders(1) '# NOTES..........: '#-------------------------------------------------------------------------Sub ResetSortOrders(intChoice) Select Case intChoice Case 1 booUserSort = 1 booFirstNameSort = 1 booSurnameSort = 1 booTitleSort = 1 booEmailSort = 1 Case 2 booPCNameSort = 1 booPCDescSort = 1 booPCOSSort = 1 booPCSPSort = 1 Case 3 booGroupNameSort = 1 booGroupDescSort = 1 booGroupTypeSort = 1 booGroupEmailSort = 1 End Select End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: '# '# ARGUMENTS......: '# EXAMPLE........: ShowUserInfo(strUser) Performs search in AD for specified user and displays current info strUser = user to be searched ShowUserInfo(johsmi)

'# NOTES..........: '#-------------------------------------------------------------------------Sub ShowUserInfo(strUser) strCompany = "" strCountry = "" strOffice = "" strDescription = "" strFirstName = "" strSurname = "" strDepartment = "" LUOtherSelect.Value = 0 ResetDelegates() If strUser <> "" Then txtLUUsername.Value = strUser If strUser = "" OR (txtLUUsername.Value = "Username" _ AND txtLUUsername.style.color = "#888888") Then ChangeLayout(LayoutUser) ResetLayoutUser() Exit Sub End If strUser = Trim(strUser) Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,objectCategory,proxyAddresses , publicDelegatesBL, publicDelegates" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False On Error Resume Next Set objRecordset = objCommand.Execute booOptimiseSearch = objShell.RegRead("HKCU\Software\SKB\ADManage mentUtil\Setup\booOptimiseSearch") If booOptimiseSearch = 0 Then If objRecordset.EOF = True Then UnknownUserSearch strUser, 1 Exit Sub End If Else If booSearched = 0 Then UnknownUserSearch strUser, 1

Exit Sub End If booSearched = 0 End If Set objOption = Document.createElement("OPTION") objOption.Text = "Custom..." objOption.Value = 0 objOption.Title = "Enter a custom email address" EmailSelect.Add(objOption) Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedName").Val ue arrProxyAddresses = objRecordSet.Fields("proxyAddresses" ).Value If IsArray(objRecordSet.Fields("proxyAddresses")) Then For Each objItem in arrProxyAddresses If Left(LCase(objItem), 5) = "smtp:" Th en objItem = Replace(LCase(objItem) , "smtp:", "") Set objOption = Document.createE lement("OPTION") objOption.Text = objItem objOption.Value = objItem objOption.Title = objItem EmailSelect.Add(objOption) End If Next End If arrPublicDelegatesBL = objRecordSet.Fields("publicDelega tesBL").Value If IsArray(objRecordSet.Fields("publicDelegatesBL")) The n For Each objItem in arrPublicDelegatesBL strMsgPublicDelegatesBL = strMsgPublicDe legatesBL & objItem & vbCrLf Next End If arrPublicDelegates = objRecordSet.Fields("publicDelegate s").Value If IsArray(objRecordSet.Fields("publicDelegates")) Then For Each objItem in arrPublicDelegates strMsgPublicDelegates = strMsgPublicDele gates & objItem & vbCrLf Next End If objRecordset.MoveNext Loop objRecordset.Close Set objUser = GetObject("LDAP://" & strUserDN) strDispName = objUser.Get("displayName") strStreetAddress = objUser.Get("streetAddress") strPOBOX = objUser.Get("postOfficeBox")

strCity = objUser.Get("l") strPostcode = objUser.Get("postalCode") strTelephoneNumber = objUser.Get("telephoneNumber") strMobile = objUser.Get("mobile") strFaxNo = objUser.Get("facsimileTelephoneNumber") strTitle = objUser.Get("title") strOffice = objUser.Get("physicalDeliveryOfficeName") strCounty = objUser.Get("st") strEmail = objUser.Get("mail") strCompany = objUser.Get("company") strCountry = objUser.Get("co") strDepartment = objUser.Get("department") strDNTitle = objUser.Get("distinguishedName") strDN = Replace(strDNTitle, ",", ", ") strDescription = objUser.Get("description") strFirstName = objUser.Get("givenName") strSurname = objUser.Get("sn") For Each objOption In EmailSelect.Options If LCase(objOption.Value) = LCase(strEmail) Then objOption.Selected = True strDefaultEmail = objOption.Value End If Next txtLUDispName.Value = strDispName txtLUAdd.Value = strStreetAddress txtLUCity.Value = strCity txtLUPostcode.Value = strPostcode txtLUPhN.Value = strTelephoneNumber txtLUMobile.Value = strMobile txtLUTitle.Value = strTitle txtLUCounty.Value = strCounty txtLUEmailAdd.Value = strEmail LUDNSpan.InnerHTML = strDN ViewUACSpan.InnerHTML = "View UAC" EmailLabel.InnerHTML = "Custom" DelProxyLabel.InnerHTML = "X" txtLUDispName.Title = "Display Name: " & strDispName txtLUAdd.Title = "Street Address: " & strStreetAddress txtLUCity.Title = "City: " & strCity txtLUPostcode.Title = "Postcode: " & strPostcode txtLUPhN.Title = "Telephone: " & strTelephoneNumber txtLUMobile.Title = "Mobile Phone: " & strMobile txtLUTitle.Title = "Title: " & strTitle txtLUCounty.Title = "County: " & strCounty txtLUEmailAdd.Title = "Email Address: " & strEmail EmailSelect.Title = "Select Email Address" LUDNSpan.Title = "DN: " & strDNTitle ViewUACSpan.Title = "View User Account Control for '" & strUser & "'" btnLUUpdateInf.Title = "Update account details" btnLUPrintNow.Title = "Print Window" btnLUReset.Title = "Reset Form" btnLUSearch.Title = "" EmailLabel.Title = "Enter a custom email address" DelProxyLabel.Title = "Delete selected proxy address" btnLUDelegates.Title = "Show delegates"

txtLUAdd.Disabled = False txtLUCity.Disabled = False txtLUPostcode.Disabled = False txtLUPhN.Disabled = False txtLUMobile.Disabled = False txtLUTitle.Disabled = False txtLUCounty.Disabled = False txtLUDispName.Disabled = False EmailSelect.Disabled = False txtLUCustom.Disabled = False LUOtherSelect.Disabled = False LUDNSpan.Disabled = False btnLUUpdateInf.Disabled = False btnLUPrintNow.Disabled = False btnLUReset.Disabled = False btnLUSearch.Disabled = True btnLUDelegates.Disabled = False txtLUAdd.className = "text" txtLUCity.className = "text" txtLUPostcode.className = "text" txtLUPhN.className = "text" txtLUMobile.className = "text" txtLUTitle.className = "text" txtLUCounty.className = "text" txtLUDispName.className = "text" EmailSelect.className = "" txtLUCustom.className = "text" LUOtherSelect.className = "" LUDNSpan.className = "LUDNSpan" btnLUUpdateInf.className = "button" btnLUPrintNow.className = "button" btnLUReset.className = "button" btnLUDelegates.className = "button" btnLUSearch.className = "button disabled" txtLUUsername.Value = strUser txtLUUsername.Value = " " & Trim(txtLUUsername.Value) txtLUUsername.className = "text userdis" txtLUUsername.Disabled = True For Each objOption In LUOtherSelect Select Case objOption.Value Case "company" objOption.Title = "Company: " & strCompa ny Case "co" objOption.Title = "Country: " & strCount ry Case "department" objOption.Title = "Department: " & strDe partment Case "description" objOption.Title = "Description: " & strD escription Case "givenName" objOption.Title = "First Name: " & strFi rstName Case "sn" objOption.Title = "Surname: " & strSur

name Case "physicalDeliveryOfficeName" objOption.Title = "Office: " & strOffice Case "facsimileTelephoneNumber" objOption.Title = "Fax Number: " & strFa xNo End Select Next GetOtherInfo() ChangeLayout(LayoutUser) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: GetOtherInfo() '# PURPOSE........: Displays "Other" info for chosen field '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub GetOtherInfo() If LUOtherSelect.Value <> "0" Then txtLUCustom.Value = "" Select Case LUOtherSelect.Value Case "company" strCustom = strCompany strCustomTitle = "Company: " Case "co" strCustom = strCountry strCustomTitle = "Country: " Case "department" strCustom = strDepartment strCustomTitle = "Department: " Case "description" strCustom = strDescription strCustomTitle = "Description: " Case "givenName" strCustom = strFirstName strCustomTitle = "First Name: " Case "sn" strCustom = strSurname strCustomTitle = "Surname: " Case "physicalDeliveryOfficeName" strCustom = strOffice strCustomTitle = "Office: " Case "facsimileTelephoneNumber" strCustom = strFaxNo strCustomTitle = "Fax Number: " End Select txtLUCustom.Value = strCustom txtLUCustom.Title = strCustomTitle & strCustom Else txtLUCustom.Value = "" txtLUCustom.Title = "" End If End Sub '#----------------------------------------------------------------------

---'# SUBROUTINE.....: ToggleDelegates() '# PURPOSE........: Toggles between Delegates and DN '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ToggleDelegates() If Trim(LUDelgateLabeltd.InnerHTML) = "Distinguished Name:" Then LUDelgateLabeltd.InnerHTML = "Has Delegates:" LUDelgateLabel2td.InnerHTML = "Delegate Of:" btnLUDelegates.Value = "DN" btnLUDelegates.Title = "Show DN" LUDNtd.className = "hidden" LUDelegatetd.className = "" LUDelegateBLtd.className = "" ViewDelegates() Else LUDelgateLabeltd.InnerHTML = "Distinguished Name :" LUDelgateLabel2td.InnerHTML = "&nbsp;" btnLUDelegates.Value = "DELEGATES" btnLUDelegates.Title = "Show delegates" LUDNtd.className = "" LUDelegatetd.className = "hidden" LUDelegateBLtd.className = "hidden" End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ViewDelegates() '# PURPOSE........: Shows all delegates related to user '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ViewDelegates() strUser = txtLUUsername.Value strUser = Trim(strUser) Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,objectCategory,publicDelegate sBL,publicDelegates" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False

On Error Resume Next Set objRecordset = objCommand.Execute Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedName").Val ue arrPublicDelegatesBL = objRecordSet.Fields("publicDelega tesBL").Value If IsArray(objRecordSet.Fields("publicDelegatesBL")) The n For Each objItem in arrPublicDelegatesBL Set objUser = GetObject("LDAP://" & objI tem) strDelegate = objUser.Get("displayName") strUserName = objUser.Get("sAMAccountNam e") strPublicDelegatesBL = strPublicDelegate sBL & _ "<span class = ""spanlink"" onClick=Show UserInfo(""" & strUserName & _ """) title=""View / change user info for '" & strUserName & "'"">" & strDelegate & "</span><br>" Next End If arrPublicDelegates = objRecordSet.Fields("publicDelegate s").Value If IsArray(objRecordSet.Fields("publicDelegates")) Then For Each objItem in arrPublicDelegates Set objUser = GetObject("LDAP://" & objI tem) strDelegate = objUser.Get("displayName") strUserName = objUser.Get("sAMAccountNam e") strPublicDelegates = strPublicDelegates & _ "<span class = ""spanlink"" onClick=Show UserInfo(""" & strUserName & _ """) title=""View / change user info for '" & strUserName & "'"">" & strDelegate & "</span><br>" Next End If objRecordset.MoveNext Loop objRecordset.Close If strPublicDelegatesBL <> "" Then _ LUDelegateBLtd.InnerHTML = "<div id=""LUDelegateBLSpan"" class=""DelegateSpan"" style=""width:330px;"">" & _ strPublicDelegatesBL & "</div>" If strPublicDelegates <> "" Then _ LUDelegatetd.InnerHTML = "<div id=""LUDelegateSpan"" cla ss=""DelegateSpan"" style=""width:334px;"">" & _ strPublicDelegates & "</div>" End Sub

'#------------------------------------------------------------------------'# SUBROUTINE.....: SelectEmailAdd() '# PURPOSE........: Changes Email input to Custom if required '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub SelectEmailAdd() If EmailSelect.Value = "0" Then ChangeEmailType() End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ChangeEmailType() '# PURPOSE........: Changes Email input '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ChangeEmailType() If EmailLabel.InnerHTML = "Custom" Then txtLUEmailAdd.Value = strDefaultEmail EmailSelect.className = "hidden" txtLUEmailAdd.className = "text" EmailLabel.InnerHTML = "Select" EmailLabel.Title = "Select an email address from a list of proxy addresses assigned to the user" DelProxyLabel.InnerHTML = "" DelProxyLabel.Title = "" ElseIf EmailLabel.InnerHTML = "Select" Then EmailSelect.Value = strDefaultEmail EmailSelect.className = "" txtLUEmailAdd.className = "text hidden" EmailLabel.InnerHTML = "Custom" EmailLabel.Title = "Enter a custom email address " DelProxyLabel.InnerHTML = "X" DelProxyLabel.Title = "Delete selected proxy add ress" End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: DeleteProxyAddress() '# PURPOSE........: Deletes selected proxy address '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub DeleteProxyAddress() Const ADS_PROPERTY_DELETE = 4 strUser = txtLUUsername.Value strEmailDel = EmailSelect.Value ContinuePrompt = MsgBox("Are you sure you wish to delete the pro xy address '" & _

strEmailDel & "'?", vbQuestion+vbYesNo, "AD Management Utility") If ContinuePrompt = vbYes Then Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,proxyAddresses" strQuery = strBase & ";" & strFilter & ";" & strAttribut es & ";subtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 100 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False On Error Resume Next Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "The username '" & strUser & "' cannot be found.", vbExclamation, "Error" ResetLayoutUser() Exit Sub End If Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedNa me").Value arrProxyAddresses = objRecordSet.Fields("proxyAd dresses").Value objRecordset.MoveNext Loop objRecordset.Close Set objUser = GetObject("LDAP://" & strUserDN) strEmail = objUser.Get("mail") For Each objItem In arrProxyAddresses x = Len(objItem) If Right(objItem, Len(objItem) - 5) = strEmailDe l Then objUser.PutEx ADS_PROPERTY_DELETE, "prox yAddresses", Array(objItem) Else If LCase(strEmail) = LCase(strEm ailDel) Then strEmail = Right(objItem , Len(objItem) - 5) objUser.Put "mail", strE mail End If

End If Next objUser.SetInfo If Err.Number = 0 Then ResetLayoutUser() ShowUserInfo(strUser) MsgBox "The proxy address '" & strEmailDel & "' has now been deleted", _ vbInformation, "AD Management Utility" Else MsgBox "There was an error removing the proxy address '" & _ strEmailDel & "'.", vbExclamation, "Erro r" ResetLayoutUser() End If Else ResetLayoutUser() ShowUserInfo(strUser) End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: UpdateUserInfo() '# PURPOSE........: Updates user info in AD '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub UpdateUserInfo() If txtLUDispName.Value <> "" AND txtLUUsername.Value <> "" Then strUser = txtLUUsername.Value Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,objectCategory,proxyA ddresses" strQuery = strBase & ";" & strFilter & ";" & strAttribut es & ";subtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False On Error Resume Next Set objRecordset = objCommand.Execute

If (objRecordset.EOF = True) Then MsgBox "The username '" & strUser & "' cannot be found.", vbExclamation, "Error" ResetLayoutUser() Exit Sub End If Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedNa me").Value arrProxyAddresses = objRecordSet.Fields("proxyAd dresses").Value objRecordset.MoveNext Loop objRecordset.Close Set objUser = GetObject("LDAP://" & strUserDN) objUser.Put objUser.Put objUser.Put objUser.Put objUser.Put objUser.Put objUser.Put "streetAddress", txtLUAdd.Value "l", txtLUCity.Value "PostalCode", txtLUPostcode.Value "TelephoneNumber", txtLUPhN.Value "mobile", txtLUMobile.Value "title", txtLUTitle.Value "st",txtLUCounty.Value

If EmailLabel.InnerHTML = "Custom" Then objUser.Put "mail",EmailSelect.Value ElseIf EmailLabel.InnerHTML = "Select" Then x = UBound(arrProxyAddresses) + 1 ReDim Preserve arrProxyAddresses(x) arrProxyAddresses(x) = "smtp:" & txtLUEm ailAdd.Value objUser.Put "proxyAddresses",arrProxyAdd resses objUser.Put "mail",txtLUEmailAdd.Value End If Select Case LUOtherSelect.Value Case "company" objUser.Put "company", txtLUCustom.Value Case "co" objUser.Put "co", txtLUCustom.Value Case "department" objUser.Put "department", txtLUCustom.Va lue Case "description" objUser.Put "description", txtLUCustom.V alue Case "givenName" objUser.Put "givenName", txtLUCustom.Val ue Case "sn" objUser.Put "sn", txtLUCustom.Value Case "physicalDeliveryOfficeName" objUser.Put "physicalDeliveryOfficeName" , txtLUCustom.Value Case "facsimileTelephoneNumber" objUser.Put "facsimileTelephoneNumber", txtLUCustom.Value

Case Else End Select Err.Clear objUser.SetInfo If Err.Number <> 0 Then MsgBox "There was an error updating the user det ails for '" & _ Trim(txtLUUsername.Value) & "':" & vbCrLf & vbCr Lf & Err.Description, _ vbExclamation, "Error" Err.Clear Else MsgBox "The user details for '" & Trim(t xtLUUsername.Value) & _ "' have now been updated.", vbInformatio n, "AD Management Utility" End If ResetLayoutUser() ShowUserInfo(strUser) Else ResetLayoutUser() End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ResetLayoutUser() '# PURPOSE........: Resets form for the User info '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ResetLayoutUser() txtLUAdd.Value = "" txtLUCity.Value = "" txtLUPostcode.Value = "" txtLUPhN.Value = "" txtLUMobile.Value = "" txtLUTitle.Value = "" txtLUCounty.Value = "" txtLUDispName.Value = "" txtLUUsername.Value = "" txtLUEmailAdd.Value = "" txtLUCustom.Value = "" LUDNSpan.InnerHTML = "&nbsp;" ViewUACSpan.InnerHTML = "" LUOtherSelect.Value = 0 EmailLabel.InnerHTML = "" DelProxyLabel.InnerHTML = "" txtLUDispName.Title = "" txtLUAdd.Title = "" txtLUCity.Title = "" txtLUPostcode.Title = "" txtLUPhN.Title = "" txtLUMobile.Title = ""

txtLUTitle.Title = "" txtLUCounty.Title = "" EmailSelect.Title = "" LUDNSpan.Title = "" ViewUACSpan.Title = "" btnLUUpdateInf.Title = "" btnLUPrintNow.Title = "" btnLUReset.Title = "" btnLUSearch.Title = "Search username" EmailLabel.Title = "" DelProxyLabel.Title = "" txtLUAdd.Disabled = True txtLUCity.Disabled = True txtLUPostcode.Disabled = True txtLUPhN.Disabled = True txtLUMobile.Disabled = True txtLUTitle.Disabled = True txtLUCounty.Disabled = True txtLUDispName.Disabled = True EmailSelect.Disabled = True txtLUCustom.Disabled = True LUOtherSelect.Disabled = True btnLUUpdateInf.Disabled = True btnLUPrintNow.Disabled = True btnLUReset.Disabled = True btnLUSearch.Disabled = False ClearListbox(EmailSelect) txtLUAdd.className = "text disabled" txtLUCity.className = "text disabled" txtLUPostcode.className = "text disabled" txtLUPhN.className = "text disabled" txtLUMobile.className = "text disabled" txtLUTitle.className = "text disabled" txtLUCounty.className = "text disabled" txtLUDispName.className = "text disabled" EmailSelect.className = "disabled" txtLUEmailAdd.className = "text hidden" txtLUCustom.className = "text disabled" LUOtherSelect.className = "disabled" btnLUUpdateInf.className = "button disabled" btnLUPrintNow.className = "button disabled" btnLUReset.className = "button disabled" btnLUSearch.className = "button" LUDNSpan.className = "LUDNSpan disabled" strCompany = "" strCountry = "" strOffice = "" strDescription = "" strFirstName = "" strSurname = "" strFaxNo = "" txtLUUsername.Disabled = False txtLUUsername.className = "text" txtLUUsername.Value = "Username" txtLUUsername.style.color = "#888888"

ResetDelegates() CloseSearch(0) ChangeLayout(LayoutUser) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ResetDelegates() '# PURPOSE........: Resets options for Delegates '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ResetDelegates() LUDelegateBLtd.InnerHTML = "<div id=""LUDelegateBLSpan"" class=" "DelegateSpan"" style=""width:330px;""><span style=""font-weight:bold;"">&nbsp;< /span></div>" LUDelegatetd.InnerHTML = "<div id=""LUDelegateSpan"" class=""Del egateSpan"" style=""width:333px;""><span style=""font-weight:bold;"">&nbsp;</spa n></div>" LUDelgateLabeltd.InnerHTML = "Distinguished Name:" LUDelgateLabel2td.InnerHTML = "&nbsp;" btnLUDelegates.Value = "DELEGATES" btnLUDelegates.Disabled = True btnLUDelegates.className = "button disabled" btnLUDelegates.Title = "" LUDNtd.className = "" LUDelegatetd.className = "hidden" LUDelegateBLtd.className = "hidden" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: u '# ARGUMENTS......: strUser = user to be searched '# EXAMPLE........: ReloadLayoutUser(johsmi) '# NOTES..........: Required to clear listbox before loading data '#-------------------------------------------------------------------------Sub ReloadLayoutUser(strUser) ResetLayoutUser() ShowUserInfo(strUser) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: GetGroupInfo() '# PURPOSE........: Retrieve all groups in AD and adds to Select box '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub GetGroupInfo() document.body.style.cursor = "wait" i = 0 ReloadLayoutUser(strUser) Resets and then loads user data in User Info men

If GroupFilterSelect.className = "hidden" Then ClearFilter() Const ForReading = 1 Const ForWriting = 2 strAppData = objShell.SpecialFolders("AppData") strCacheFolder = strAppData & "\AD Management Utility" strCacheFileName = "groupcache" strCacheFile = strCacheFolder & "\" & strCacheFileName Set objFSO = CreateObject("Scripting.FileSystemObject") GroupSelect.Value = "" ClearListbox(GroupSelect) If booCacheGroups = 1 AND objFSO.FileExists(strCacheFile) Then Set objFile = objFSO.OpenTextFile(strCacheFile, ForReadi ng, True) While Not objFile.AtEndOfStream strLine = objFile.ReadLine arrLine = Split(strLine, "<!>") strGroupName = arrLine(0) strGroupDN = arrLine(1) strTitle = arrLine(2) strGroupDescription = arrLine(3) Set objOption = Document.createElement("OPTION") objOption.Text = strGroupName objOption.Value = strGroupDN & "<!>" & strGroupD escription objOption.Title = strTitle GroupSelect.Add(objOption) strGroupDescription = "" i = i + 1 WEnd objFile.Close Else If booCacheGroups = 1 AND NOT objFSO.FolderExist s(strCacheFolder) Then objFSO.CreateFolder(strCacheFolder) Set objConnection = CreateObject("ADODB.Connecti on") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strRootOU & ">" If booCacheGroups = 1 Then Set objFile = objFSO. OpenTextFile(strCacheFile, ForWriting, True) strFilter = "(objectcategory=group)" strAttributes = "name,description,groupType,mail

,distinguishedName" strQuery = strBase & ";" & strFilter & ";" & str Attributes & ";subtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False objCommand.Properties("Sort on") = "name" Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "There are no groups in the speci fied OU (" & strDNSDomain & "), or the OU has been entered " & _ "incorrectly. ", vbInformation, "AD Man agement Utility" Exit Sub End If Do Until objRecordSet.EOF On Error Resume Next strGroupDN = objRecordset.Fields("distin guishedName").Value strGroupName = objRecordSet.Fields("name ").Value intGroupType = objRecordSet.Fields("grou pType").Value strGroupEmail = objRecordSet.Fields("mai l").Value strGroupTmpDesc = objRecordSet.Fields("d escription").Value If IsArray(strGroupTmpDesc) Then For x = 0 To UBound(strGroupTmpD esc) strGroupDescription = st rGroupDescription & " " & strGroupTmpDesc(x) Next End If Set objOption = Document.createElement(" OPTION") Select Case intGroupType Case 2 strText = strGroupName objOption.Text = strText Case 4 strText = strGroupName objOption.Text = strText Case 8 strText = strGroupName objOption.Text = strText Case -2147483646 strText = strGroupName & " (Sec)" objOption.Text = strText Case -2147483644

strText = strGroupName & " (Sec)" objOption.Text = strText Case -2147483640 strText = strGroupName & " (Sec)" objOption.Text = strText Case -2147483643 strText = strGroupName & " (Sec)" objOption.Text = strText Case Else objOption.Text = strGrou pName End Select If strGroupDescription <> "" AND NOT IsN ull(strGroupDescription) Then strTitle = strGroupName & " - " & strGroupDescription objOption.Title = strTitle Else strTitle = strGroupName objOption.Title = strTit le End If objOption.Value = strGroupDN & "<!>" & s trGroupDescription If booCacheGroups = 1 Then _ objFile.WriteLine strText & "<!> " & strGroupDN & "<!>" & strTitle & "<!>" & strGroupDescription GroupSelect.Add(objOption) objRecordSet.MoveNext strGroupDescription = "" i = i + 1 Loop If booCacheGroups = 1 Then objFile.Close End If intTotalGroups = i L1intGroups.InnerHTML = i document.body.style.cursor = "default" ChangeLayout(LayoutGroup) btnLGDelete.Disabled = True btnLGDelete.className = "button disabled" btnLGDelete.title = "" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: ReloadGroups() Reloads group cache file

'# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ReloadGroups() On Error Resume Next strAppData = objShell.SpecialFolders("AppData") strCacheFile = strAppData & "\AD Management Utility\groupcache" Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.DeleteFile(strCacheFile) ResetLayoutGroup() GetGroupInfo() End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ClearFilterText() '# PURPOSE........: Clears group filter text box '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ClearFilterText() If Right(txtLGFilter.Value, 9) = "Filter..." Then txtLGFilter.style.color = "black" txtLGFilter.Value = "" End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: x '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ClearFilter() GroupFilterSelect.className = "hidden" GroupSelect.className = "" txtLGFilter.style.color = "#888888" txtLGFilter.Value = "Filter..." End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: ter '# box '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ShowFilterMembers() ShowFilterMembers() Begins process of showing group members from fil ClearFilter() Clears group filter and shows original select bo

GroupSelect.Value = GroupFilterSelect.Value ShowMembers() End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: FilterGroups() '# PURPOSE........: Filters group select box as per filter text '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: Uses secondary filtered select box '#-------------------------------------------------------------------------Sub FilterGroups() On Error Resume Next strFilter = LCase(txtLGFilter.Value) i = 0 ClearListbox(GroupMembersSelect) Set optGroup = document.getElementById("optGroupSelect") optGroup.RemoveNode Set optGroup = document.getElementById("optUserSelect") optGroup.RemoveNode Set optGroup = document.getElementById("optOtherSelect") optGroup.RemoveNode ClearListbox(GroupFilterSelect) GroupMembersSelect.Value = "" GroupMembersSelect.className = "disabled" L1intMembers.InnerHTML = "" For Each objOption In GroupSelect.Options Set objOption2 = Document.createElement("OPTION") objOption2.Text = objOption.Text objOption2.Title = objOption.Title objOption2.Value = objOption.Value GroupFilterSelect.Add(objOption2) i = i + 1 Next For Each objOption In GroupFilterSelect.Options If InStr(LCase(objOption.Text), strFilter) = 0 Then objOption.RemoveNode i = i - 1 End If Next L1intGroups.InnerHTML = i GroupFilterSelect.className = "" GroupSelect.className = "hidden" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: '# ARGUMENTS......: ShowMembers() Retrieve members of selected group

'# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ShowMembers() On Error Resume Next arrGroupDN = Split(GroupSelect.Value, "<!>") strGroupDN = arrGroupDN(0) strGroupDescription = arrGroupDN(1) GroupDescSpan.InnerHTML = strGroupDescription PauseScript(0) ClearListbox(GroupMembersSelect) i = 0 g = 0 u = 0 o = 0 strGroupDN strGroupDN strGroupDN strGroupDN strGroupDN strGroupDN strGroupDN strGroupDN

= = = = = = = =

Replace(strGroupDN, Replace(strGroupDN, Replace(strGroupDN, Replace(strGroupDN, Replace(strGroupDN, Replace(strGroupDN, Replace(strGroupDN, Replace(strGroupDN,

"\", "\\") "#", "\#") "+", "\+") "<", "\<") ">", "\>") ";", "\;") Chr(34), "\" & Chr(34)) "/", "\/")

Set optGroup = document.getElementById("optGroupSelect") optGroup.RemoveNode Set optGroup = document.getElementById("optUserSelect") optGroup.RemoveNode Set optGroup = document.getElementById("optOtherSelect") optGroup.RemoveNode Set optGroup = Document.createElement("optgroup") optGroup.id = "optUserSelect" optGroup.label = "Users" GroupMembersSelect.appendChild(optGroup) Set optGroup = Document.createElement("optgroup") optGroup.id = "optGroupSelect" optGroup.label = "Groups" GroupMembersSelect.appendChild(optGroup) Set optGroup = Document.createElement("optgroup") optGroup.id = "optOtherSelect" optGroup.label = "Others" GroupMembersSelect.appendChild(optGroup) Set GroupTmpDataList = CreateObject("ADOR.Recordset") GroupTmpDataList.Fields.Append "distinguishedName", adVarChar, M axCharacters GroupTmpDataList.Fields.Append "sAMAccountName", adVarChar, MaxC haracters GroupTmpDataList.Fields.Append "displayName", adVarChar, MaxChar acters GroupTmpDataList.Fields.Append "objectCategory", adVarChar, MaxC haracters

GroupTmpDataList.Fields.Append "mail", adVarChar, MaxCharacters GroupTmpDataList.Open Set objGroup = GetObject("LDAP://" & strGroupDN) For Each objMember In objGroup.Members strUser = objMember.sAMAccountName strDN = objMember.distinguishedName strName = objMember.displayName strCategory = objMember.objectCategory strEmail = objMember.mail If strName = "" OR IsNull(strName) Then strName = strUse r GroupTmpDataList.AddNew GroupTmpDataList("distinguishedName") = strDN GroupTmpDataList("sAMAccountName") = strUser GroupTmpDataList("displayName") = strName GroupTmpDataList("objectCategory") = strCategory GroupTmpDataList("mail") = strEmail GroupTmpDataList.Update Next GroupTmpDataList.Sort = "displayName" GroupTmpDataList.MoveFirst Do Until GroupTmpDataList.EOF strDN = GroupTmpDataList("distinguishedName").Value strUser = GroupTmpDataList("sAMAccountName").Value strName = GroupTmpDataList("displayName").Value strCategory = GroupTmpDataList("objectCategory").Value strEmail = GroupTmpDataList("mail").Value GroupTmpDataList.MoveNext Set objOption = Document.createElement("OPTION") objOption.InnerHTML = strName objOption.Value = strName & "||" & strDN If Left(LCase(strCategory), 8) = "cn=group" Then objOption.Title = strName & " (Double-click to v iew)" Set optGroup = document.getElementById("optGroup Select") g = g + 1 ElseIf Left(LCase(strCategory), 9) = "cn=person" AND strUser <> "" _ AND Not IsNull(strUser) Then objOption.Title = strUser & " (Double-cl ick to view)" Set optGroup = document.getElementById(" optUserSelect") u = u + 1 Else objOption.InnerHTML = strName & " (" & strEmail & ")" objOption.Title = strName & " (D ouble-click to send email)"

objOption.Value = strName & "||" & strDN & "||" & strEmail Set optGroup = document.getEleme ntById("optOtherSelect") o = o + 1 End If optGroup.appendChild(objOption) i = i + 1 Loop If g = 0 Then Set optGroup = document.getElementById("optGroupSelect") optGroup.RemoveNode End If If u = 0 Then Set optGroup = document.getElementById("optUserSelect") optGroup.RemoveNode End If If o = 0 Then Set optGroup = document.getElementById("optOtherSelect") optGroup.RemoveNode End If btnLGRemove.Disabled = True btnLGRemove.className = "button disabled" btnLGRemove.title = "" txtLGUsername.Disabled = False txtLGUsername.className = "text" txtLGUsername.title = "User / Group" btnLGAdd.Disabled = False btnLGAdd.className = "button" btnLGAdd.title = "Add user to group" GroupMembersSelect.className = "" GroupMembersSelect.Disabled = False btnLGDelete.Disabled = False btnLGDelete.className = "button" btnLGDelete.title = "Delete group" L1intMembers.InnerHTML = i End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: DeleteGroup() '# PURPOSE........: Delete group '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub DeleteGroup() arrDN = Split(GroupSelect.Value, "<!>") strDN = arrGroupDN(0) ContinuePrompt = MsgBox("Are you sure you wish to delete this gr oup?", vbQuestion+vbYesNo, "AD Management Utility")

If ContinuePrompt = vbYes Then arrDN = Split(strDN, ",") strGroupCN = arrDN(0) strOU = "" For i = 1 To UBound(arrDN) - 1 strOU = strOU & arrDN(i) & "," Next strOU = strOU & arrDN(UBound(arrDN)) Set objOU = GetObject("LDAP://" & strOU) Err.Clear objOU.Delete "group", strGroupCN If Err.Number = 0 Then ResetLayoutGroup() MsgBox "This group has now been deleted", vbInfo rmation, "AD Management Utility" Else MsgBox "There was an error deleting this group.", vbExclamation, "Error" End If End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: rs '# area '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ChooseMember() btnLGRemove.Disabled = False btnLGRemove.className = "button" btnLGRemove.title = "Remove user from group" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: RemoveGroupUser() '# PURPOSE........: Remove user from group '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub RemoveGroupUser() arrValue = Split(GroupMembersSelect.Value, "||") strUser = arrValue(0) strDN = arrValue(1) ContinuePrompt = MsgBox("Are you sure you wish to remove the use r '" & _ strUser & "' from this group?", vbQuestion+vbYesNo, "AD Manageme nt Utility") ChooseMember() Action performed when clicking on group in Membe

If ContinuePrompt = vbYes Then arrGroupDN = Split(GroupSelect.Value, "<!>") strGroupDN = arrGroupDN(0) Set objGroup = GetObject("LDAP://" & strGroupDN) strUserPath = "LDAP://" & strDN For Each objMember In objGroup.Members If LCase(objMember.adspath) = LCase(strUserPath) Then objGroup.Remove(strUserPath) ShowMembers() ShowUserGroups() MsgBox "The user '" & strUser & "' has n ow been removed from this group", _ vbInformation, "AD Management Utility" Exit Sub End If Next ShowMembers() MsgBox "The user '" & strUser & "' could not be removed from this group.", _ vbExclamation, "Error" Else GroupMembersSelect.Value = "" End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: AddGroupUser() '# PURPOSE........: Add user to group '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub AddGroupUser() strUser = txtLGUsername.Value If strUser = "" Then txtLGUsername.Value = "User / Group" txtLGUsername.style.color = "#888888" Exit Sub End If GroupMembersSelect.Disabled = False Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,objectCategory" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s

ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False On Error Resume Next Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then UnknownGroupUserSearch strUser Exit Sub End If ContinuePrompt = MsgBox("Are you sure you wish to add the item t o this group?", vbQuestion+vbYesNo, "AD Management Utility") If ContinuePrompt = vbYes Then Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedNa me").Value objRecordset.MoveNext Loop objRecordset.Close Set objUser = GetObject("LDAP://" & strUserDN) arrGroupDN = Split(GroupSelect.Value, "<!>") strGroupDN = arrGroupDN(0) Set objGroup = GetObject("LDAP://" & strGroupDN) objGroup.Add(objUser.ADsPath) If Err.Number <> 0 Then strError = "There was an error adding the item t o this group." Select Case Err.Number Case -2147019886 strError = strError & vbCrLf & vbCrLf & "The item already exists in this group." Case Else End Select MsgBox strError, vbExclamation, "Error" Else ShowMembers() If LCase(txtLGUsername.Value) = LCase(tx tLGUsername2.Value) Then ShowUserGroups() MsgBox "The item has now been added to t his group.", vbInformation, "AD Management Utility" End If End If txtLGUsername.Value = "User / Group" txtLGUsername.style.color = "#888888" End Sub

'#------------------------------------------------------------------------'# SUBROUTINE.....: UnknownGroupUserSearch(strInput) '# PURPOSE........: Performs search where unknown username entered, '# shows info in table on l eft of app '# ARGUMENTS......: strInput = Username entered '# EXAMPLE........: UnknownGroupUserSearch("john") '# NOTES..........: '#-------------------------------------------------------------------------Sub UnknownGroupUserSearch(strInput) strHTML = "<table style=""border-collapse:collapse;table-layout: fixed;"">" strHTML = strHTML & "<tr><td style=""width:46%;height:0px""><td style=""width:46%;height:0px""><td style=""height:0px""></tr>" strHTML = strHTML & "<tr><th colspan=3 style=""background-color: black;color:white;"">" strHTML = strHTML & "<span style=""float:left;margin-left:125px; "">Search</span>" strHTML = strHTML & "<span style=""float:right;cursor:hand;margi n-right:10px;"" onClick=""CloseGroupSearch()"" title=""Close"">X</span></th></tr >" Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(&(|(objectClass=user)(objectClass=group))(|(sAMAcc ountName=*" & strInput & "*)(name=*" & strInput & "*)))" strAttributes = "distinguishedName,sAMAccountName,name,objectCat egory" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False objCommand.Properties("Sort on") = "sAMAccountName" On Error Resume Next Set objRecordset = objCommand.Execute If objRecordset.EOF = True Then CloseGroupSearch() MsgBox "No users / groups have been found.", vbInformati on, "AD Management Utility" Exit Sub End If Do Until objRecordset.EOF strUser = objRecordset.Fields("sAMAccountName").Value strName = objRecordset.Fields("name").Value strCategory = objRecordset.Fields("objectCategory").Valu

e objRecordset.MoveNext If NOT IsNull(strUser) AND NOT IsNull(strName) Then strNewUser = Replace(strUser, "'", "||") strNewUser = Replace(strNewUser, Chr(34), "{}") strNewUser = Replace(strNewUser, " ", "<>") If Left(strUser, 1) = "$" Then strUser = strName strUser strUser strName strName = = = = Replace(strUser, Replace(strUser, Replace(strName, Replace(strName, "'", "") Chr(34), "") "'", "") Chr(34), "")

strHTML = strHTML & "<tr>" strHTML = strHTML & "<td style=""backgroundcolor:white;border-left:1px solid black;border-bottom:1px solid black;width:48%; "">" strHTML = strHTML & "<span class=""s panlink"" onClick='ShowSearchGroupUser """ & strNewUser & """' title=""Pick '" & strUser & "'"">" & strUser & "</span>" strHTML = strHTML & "</td>" strHTML = strHTML & "<td style=""backgroundcolor:white;border-bottom:1px solid black;width:48%;"">" strHTML = strHTML & strName strHTML = strHTML & "</td>" strHTML = strHTML & "<td style=""backgroundcolor:white;border-right:1px solid black;border-bottom:1px solid black;text-alig n:center;font-weight:bold;"">" If Left(LCase(strCategory), 8) = "cn=group" Then strHTML = strHTML & "G" Else strHTML = strHTML & "U" End If strHTML = strHTML & "</td>" strHTML = strHTML & "</tr>" End If Loop objRecordset.Close strHTML = strHTML & "</table>" GroupSelect.Disabled = True btnLGDelete.Disabled = True btnLGDelete.className = "button disabled" btnLGDelete.title = "" GroupMembersSelect.Disabled = True UsernameSearchSpan.InnerHTML = strHTML UsernameSearchSpan.className = "" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: '# ARGUMENTS......: ShowSearchGroupUser(strUser) Shows the info for the chosen user strUser = Username

'# EXAMPLE........: ShowSearchGroupUser("johsmi") '# NOTES..........: '#-------------------------------------------------------------------------Sub ShowSearchGroupUser(strUser) UsernameSearchSpan.className = "hidden" GroupSelect.Disabled = False btnLGDelete.Disabled = False btnLGDelete.className = "button" btnLGDelete.title = "Delete group" If GroupMembersSelect.Disabled = False Then GroupMembersSelect.D isabled = True strUser = Replace(strUser, "||", "'") strUser = Replace(strUser, "{}", Chr(34)) strUser = Replace(strUser, "<>", " ") txtLGUsername.Value = strUser AddGroupUser() End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: CloseGroupSearch() '# PURPOSE........: Closes Group search box '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub CloseGroupSearch() GroupSelect.Disabled = False btnLGDelete.Disabled = False btnLGDelete.className = "button" btnLGDelete.title = "Delete group" GroupMembersSelect.Disabled = False txtLGUsername.Value = "User / Group" txtLGUsername.style.color = "#888888" UsernameSearchSpan.className = "hidden" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ShowUserGroups() '# PURPOSE........: Retrieve user groups in Group Memberships area '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ShowUserGroups() On Error Resume Next Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D strUser = txtLGUsername2.Value i = 0 ResetGroupMemberships() If strUser = "" OR _ (txtLGUsername2.style.color = "#888888" AND txtLGUsername2.Value

= "Username") Then txtLGUsername2.Value = "Username" txtLGUsername2.style.color = "#888888" Exit Sub End If Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,objectCategory" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False Set objRecordset = objCommand.Execute booOptimiseSearch = objShell.RegRead("HKCU\Software\SKB\ADManage mentUtil\Setup\booOptimiseSearch") If booOptimiseSearch = 0 Then If objRecordset.EOF = True Then UnknownUserSearch strUser, 2 Exit Sub End If Else If booSearched = 0 Then UnknownUserSearch strUser, 2 Exit Sub End If booSearched = 0 End If Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedName").Val ue objRecordset.MoveNext Loop objRecordset.Close Set objUser = GetObject("LDAP://" & strUserDN) intPrimaryGroupID = objUser.Get("primaryGroupID") arrGroups = objUser.GetEx("memberOf") If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then MsgBox "The memberOf attribute is not set.", vbExclamati on, "Error" txtLGUsername2.Value = "Username"

txtLGUsername2.style.color = "#888888" Else Set GroupTmpDataList = CreateObject("ADOR.Record set") GroupTmpDataList.Fields.Append "distinguishedNam e", adVarChar, MaxCharacters GroupTmpDataList.Fields.Append "name", adVarChar , MaxCharacters GroupTmpDataList.Open For Each strGroup In arrGroups arrName = Split(strGroup, ",") strName = Replace(arrName(0), "CN=", "") GroupTmpDataList.AddNew GroupTmpDataList("distinguishedName") = strGroup GroupTmpDataList("name") = strName GroupTmpDataList.Update Next GroupTmpDataList.Sort = "name" GroupTmpDataList.MoveFirst Do Until GroupTmpDataList.EOF strGroup = GroupTmpDataList("distinguish edName").Value strName = GroupTmpDataList("name").Value GroupTmpDataList.MoveNext Set objOption = Document.createElement(" OPTION") objOption.Text = strName objOption.Title = strName & " (Double-cl ick to view)" objOption.Value = strGroup UserGroupsSelect.Add(objOption) i = i + 1 Loop txtLGUsername2.style.color = "black" UserGroupsSelect.className = "" L1intGroupMembership.InnerHTML = i End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ChooseUserGroup() '# PURPOSE........: Action performed when clicking on group in Group '# Memberships area '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ChooseUserGroup() btnLGRemove2.Disabled = False

btnLGRemove2.className = "button" btnLGRemove2.title = "Remove user from group" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: RemoveUserGroup() '# PURPOSE........: Remove user from group in Group Memberships area '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub RemoveUserGroup() strUser = txtLGUsername2.Value ContinuePrompt = MsgBox("Are you sure you wish to remove the use r '" & _ strUser & "' from this group?", vbQuestion+vbYesNo, "AD Manageme nt Utility") If ContinuePrompt = vbYes Then Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,objectCategory" strQuery = strBase & ";" & strFilter & ";" & strAttribut es & ";subtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "The username '" & strUser & "' cannot be found.", vbExclamation, "Error" Exit Sub End If Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedNa me").Value objRecordset.MoveNext Loop objRecordset.Close strGroupDN = UserGroupsSelect.Value Set objGroup = GetObject("LDAP://" & strGroupDN)

strUserPath = "LDAP://" & strUserDN For Each objMember In objGroup.Members If LCase(objMember.adspath) = LCase(strUserPath) Then objGroup.Remove(strUserPath) ShowUserGroups() If GroupSelect.Value <> "" Then ShowMemb ers() MsgBox "The user '" & strUser & "' has n ow been removed from this group", _ vbInformation, "AD Management Utility" Exit Sub End If Next ShowUserGroups() MsgBox "The user '" & strUser & "' could not be removed from this group.", _ vbExclamation, "Error" Else UserGroupsSelect.Value = "" End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ResetGroupMemberships() '# PURPOSE........: Reset Group Memberships listbox '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ResetGroupMemberships() L1intGroupMembership.InnerHTML = "" ClearListBox(UserGroupsSelect) UserGroupsSelect.className = "disabled" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ChangeGroup(intType) '# PURPOSE........: Handles double click action of select boxes to '# view info as appropriate '# ARGUMENTS......: intType = Select box action triggered from '# EXAMPLE........: ChangeGroup(1) '# NOTES..........: '#-------------------------------------------------------------------------Sub ChangeGroup(intType) On Error Resume Next Select Case intType Case 1 arrValue strValue strEmail Case 2 strValue End Select

= Split(GroupMembersSelect.Value, "||") = arrValue(1) = arrValue(2) = UserGroupsSelect.Value

If strEmail <> "" Then objShell.Run "mailto://" & strEmail Exit Sub End If If strValue = "" Then Exit Sub For Each objMember In GroupSelect If InStr(objMember.Value, strValue) > 0 Then ClearFilter() GroupSelect.className = "" GroupFilterSelect.className = "hidden" objMember.Selected = True L1intGroups.InnerHTML = intTotalGroups ShowMembers() Exit Sub End If Next Set objUser = GetObject("LDAP://" & strValue) strUser = objUser.sAMAccountName If strUser <> "" AND NOT IsNull(strUser) Then txtLGUsername2.Value = strUser ShowUserGroups() End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ResetLayoutGroup() '# PURPOSE........: Reset group menu '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ResetLayoutGroup() On Error Resume Next GroupMembersSelect.Value = "" UserGroupsSelect.Value = "" txtLGUsername.Value = "User / Group" txtLGUsername.style.color = "#888888" txtLGUsername.Disabled = True txtLGUsername.className = "text disabled" txtLGUsername.title = "" txtLGUsername2.Value = "Username" txtLGUsername2.style.color = "#888888" btnLGAdd.Disabled = True btnLGAdd.className = "button disabled" btnLGAdd.title = "" btnLGRemove.Disabled = True btnLGRemove.className = "button disabled" btnLGRemove.title = "" btnLGRemove2.Disabled = True btnLGRemove2.className = "button disabled" btnLGRemove2.title = "" ClearFilter() ResetGroupMemberships() ClearListbox(GroupMembersSelect)

Set optGroup = document.getElementById("optGroupSelect") optGroup.RemoveNode Set optGroup = document.getElementById("optUserSelect") optGroup.RemoveNode Set optGroup = document.getElementById("optOtherSelect") optGroup.RemoveNode GroupMembersSelect.className = "disabled" L1intMembers.InnerHTML = "" L1intGroups.InnerHTML = "" GroupDescSpan.InnerHTML = "" GetGroupInfo() End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: '# o '# ARGUMENTS......: strUser = user to be searched '# EXAMPLE........: ShowL3UserInfo(johsmi) '# NOTES..........: '#-------------------------------------------------------------------------Sub ShowL3UserInfo(strUser) On Error Resume Next If strUser <> "" Then txtL3Username.Value = strUser If strUser = "" OR (txtL3Username.Value = "Username" _ AND txtL3Username.style.color = "#888888") Then ChangeLayout(Layout3) ResetLayout3() Exit Sub End If strUser = Trim(strUser) Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,objectCategory" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False Set objRecordset = objCommand.Execute booOptimiseSearch = objShell.RegRead("HKCU\Software\SKB\ADManage mentUtil\Setup\booOptimiseSearch") ShowL3UserInfo(strUser) Performs search in AD for specified user and displays current UAC inf

If booOptimiseSearch = 0 Then If objRecordset.EOF = True Then UnknownUserSearch strUser, 3 Exit Sub End If Else If booSearched = 0 Then UnknownUserSearch strUser, 3 Exit Sub End If booSearched = 0 End If Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedName").Val ue objRecordset.MoveNext Loop objRecordset.Close Set objUser = GetObject("LDAP://" & strUserDN) intUACFlag = objUser.Get("UserAccountControl") lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Con trol\" _ & "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 If (TypeName(objUser.accountExpires) = "Object") Then Set objExpiry = objUser.accountExpires dtmExpiry = Integer8Date(objExpiry, lngBias) Else dtmExpiry = 0 End If If (TypeName(objUser.lastLogon) = "Object") Then Set objLastLogon = objUser.lastLogon dtmLastLogon = Integer8Date(objLastLogon, lngBias) If dtmLastLogon = 0 Then L3dtmLastLogon.InnerHTML = "Never logged on" L3dtmLastLogon.Title = "Last Logon: Never logged on" Else L3dtmLastLogon.InnerHTML = dtmLastLogon L3dtmLastLogon.Title = "Last Logon: " & dtmLastLogon End If Else L3dtmLastLogon.InnerHTML = "Never logged on" L3dtmLastLogon.Title = "Last Logon: Never logged

on" End If If dtmExpiry = 0 Then If (intUACFlag AND ADS_UF_ACCOUNTDISABLE) <> 0 Then L3Enabled.InnerHTML = "<span style=""color:red;" ">Disabled</span>" strEnabledStatus = "Disabled" booDisabled = 1 L3Box10.InnerHTML = "Enable Account:" cbxL3DisableAcc.Title = "Enable Account" L3PassStatus.InnerHTML = "&nbsp;" Else L3Enabled.InnerHTML = "<span style=""col or:green;"">Enabled</span>" strEnabledStatus = "Enabled" booDisabled = 0 L3Box10.InnerHTML = "Disable Account:" cbxL3DisableAcc.Title = "Disable Account " End If Else If dtmExpiry > Now Then L3Enabled.InnerHTML = "<span style=""col or:red;"">Expiring (" & _ dtmExpiry & ")</span>" strEnabledStatus = "Expiring (" & dtmExp iry & ")" Else L3Enabled.InnerHTML = "<span sty le=""color:red;"">Expired (" & _ dtmExpiry & ")</span>" strEnabledStatus = "Expired (" & dtmExpiry & ")" End If L3Box10.InnerHTML = "Unexpire Account:" cbxL3DisableAcc.Title = "Unexpire Account" End If Set objPwdLastSet = objUser.pwdLastSet dtmPwdLastSet = Integer8Date(objPwdLastSet, lngBias) If (intUACFlag AND ADS_UF_DONT_EXPIRE_PASSWD) <> 0 Then L3PassStatus.InnerHTML = "The password <span class=""red bold"">does not</span> expire" L3dtmPwdLastSet.InnerHTML = dtmPwdLastSet L3dtmPwdLastSet.Title = "Password Set: " & dtmPwdLastSet L3dtmPwdLastSet.style.color = "black" Else intTimeInterval = Int(Now - dtmPwdLastSet) If intTimeInterval >= intMaxPwdAge AND booDisabl ed = 0 Then L3PassStatus.InnerHTML = "Password <span class=""redbold"">has expired</span>" L3dtmPwdLastSet.InnerHTML = "Expired" L3dtmPwdLastSet.Title = "Password has Ex pired" L3dtmPwdLastSet.style.color = "red" Else If booDisabled = 0 Then

intExpireDays = Int((dtm PwdLastSet + intMaxPwdAge) - Now) L3PassStatus.InnerHTML = "Password will expire in <span class=""redbold"">" & _ intExpireDays & "</span> days" L3dtmPwdLastSet.InnerHTM L = dtmPwdLastSet L3dtmPwdLastSet.Title = "Password Set: " & dtmPwdLastSet L3dtmPwdLastSet.style.co lor = "black" End If End If End If If objUser.IsAccountLocked = True Then L3Locked.InnerHTML = "<span style=""color:red;"">Locked< /span>" strLockedStatus = "Locked" cbxL3UnlockAcc.Disabled = False cbxL3UnlockAcc.className = "checkbox" cbxL3UnlockAcc.Title = "Unlock Account" Else L3Locked.InnerHTML = "<span style=""color:green; "">Not Locked</span>" strLockedStatus = "Not Locked" cbxL3UnlockAcc.Disabled = True cbxL3UnlockAcc.className = "checkbox disabled" cbxL3UnlockAcc.title = "" End If strDispName = objUser.Get("displayName") strPhone = objUser.Get("telephoneNumber") strEmail = objUser.Get("mail") dtmCreated = objUser.Get("whenCreated") dtmCreated = DateAdd("n", -lngBias, dtmCreated) dtmChanged = objUser.Get("whenChanged") dtmChanged = DateAdd("n", -lngBias, dtmChanged) L3Name.InnerHTML = strDispName L3Phone.InnerHTML = strPhone L3Email.InnerHTML = "<a href=""mailto:" & strEmail & """>" & str Email & "</a>" L3dtmCreatedOn.InnerHTML = dtmCreated L3dtmChangedOn.InnerHTML = dtmChanged EditUserSpan.InnerHTML = "Edit User" L3Enabled.className = "InfoTD" L3Locked.className = "InfoTD" L3dtmCreatedOn.className = "InfoTD" L3dtmChangedOn.className = "InfoTD" L3dtmPwdLastSet.className = "InfoTD" L3Name.className = "InfoTD" L3Phone.className = "InfoTD" L3Email.className = "InfoTD" L3dtmLastLogon.className = "InfoTD" pwdL3Pwd.className = "InfoTD" btnL3ResetPwd.className = "button"

cbxL3ForceChange.className = "checkbox" cbxL3ShowPwd.className = "checkbox" btnL3Commit.className = "button" cbxL3DisableAcc.className = "checkbox" btnL3Commit.className = "button" btnL3Reset.className = "button" btnL3PrintNow.className = "button" StrengthSpan.style.color = "" For i = 1 to 11 If i < 10 Then i = 0 & i document.getElementByID("L3Box" & i).className = "" Next btnL3PrintNow.Title = "Print Window" btnL3Reset.Title = "Reset Form" cbxL3ShowPwd.Title = "Show Password" cbxL3ForceChange.Title = "Force user to change password at next logon" L3Name.Title = "Display Name: " & strDispName L3Phone.Title = "Telephone: " & strPhone L3Email.Title = "Send email to " & strEmail L3dtmCreatedOn.Title = "Created On: " & dtmCreated L3dtmChangedOn.Title = "Last Modified: " & dtmChanged L3Enabled.Title = "Status: " & strEnabledStatus L3Locked.Title = "Locked Status: " & strLockedStatus EditUserSpan.Title = "View / change user info for '" & strUser & "'" pwdL3Pwd.Title = "Password" btnL3ResetPwd.Title = "Set password" btnL3Commit.Title = "Commit action(s)" L3Box01.className = "L3 L3Upper L3Left L3Right" L3Box01.style.backgroundcolor = "white" L3Box02.className = "L3 L3Left" L3Box03.className = "L3 L3Right" L3Box04.className = "L3 L3Left L3Right" L3Box05.className = "L3 L3Left L3Right" L3Box06.className = "L3 L3Middle L3Left" L3Box07.className = "L3 L3Middle" L3Box08.className = "L3 L3Middle" L3Box09.className = "L3 L3Middle L3Right" L3Box10.className = "L3 L3Left" L3Box11.className = "L3" L3Box12.className = "L3 L3Lower L3Left L3Right" StrengthSpan.InnerHTML = "" pwdL3Pwd.Value = "" pwdL3Pwd.Disabled = False btnL3ResetPwd.Disabled = False cbxL3ForceChange.Disabled = False cbxL3ShowPwd.Disabled = False btnL3Commit.Disabled = False cbxL3DisableAcc.Disabled = False btnL3Commit.Disabled = False btnL3Reset.Disabled = False btnL3PrintNow.Disabled = False btnL3Search.Disabled = True btnL3Search.className = "button disabled"

txtL3Username.className = "text userdis" txtL3Username.Disabled = True txtL3Username.Value = " " & Trim(txtL3Username.Value) ChangeLayout(Layout3) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: CommitL3Action() '# PURPOSE........: Performs action(s) to User Account control '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub CommitL3Action() strUser = txtL3Username.Value Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,objectCategory" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False On Error Resume Next Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "The username '" & strUser & "' cannot be found." , vbExclamation, "Error" Exit Sub End If Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedName").Val ue objRecordset.MoveNext Loop objRecordset.Close Set objUser = GetObject("LDAP://" & strUserDN) If cbxL3ForceChange.Checked = True Then objUser.Put "pwdLastSet" , 0

If cbxL3UnlockAcc.Checked = True Then objUser.put "lockoutTime", 0 If cbxL3DisableAcc.Checked = True Then Select Case L3Box10.InnerHTML Case "Disable Account:" objUser.Put "userAccountControl", 514 Case "Enable Account:" objUser.Put "userAccountControl", 512 Case "Unexpire Account:" objUser.Put "accountExpires", 0 End Select End If Err.Clear objUser.SetInfo If Err.Number <> 0 Then ShowL3UserInfo(strUser) MsgBox "There was an error performing the operations for '" & _ Trim(txtL3Username.Value) & "':" & vbCrLf & vbCrLf & _ Err.Description, vbExclamation, "Error" Else ShowL3UserInfo(strUser) MsgBox "The action(s) have been committed succes sfully.", vbInformation, "AD Management Utility" End If pwdL3Pwd.Value = "" cbxL3DisableAcc.Checked = False cbxL3ForceChange.Checked = False cbxL3UnlockAcc.Checked = False End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ResetPassword() '# PURPOSE........: Resets user password '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ResetPassword() strUser = txtL3Username.Value If cbxL3ShowPwd.Checked Then strPassword = txtL3Pwd.Value Else strPassword = pwdL3Pwd.Value End If Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection

Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(sAMAccountName=" & strUser & ")" strAttributes = "distinguishedName,objectCategory" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False On Error Resume Next Set objRecordset = objCommand.Execute If (objRecordset.EOF = True) Then MsgBox "The username '" & strUser & "' cannot be found." , vbExclamation, "Error" Exit Sub End If Do Until objRecordset.EOF strUserDN = objRecordset.Fields("distinguishedName").Val ue objRecordset.MoveNext Loop objRecordset.Close Set objUser = GetObject("LDAP://" & strUserDN) If cbxL3ForceChange.Checked = True Then objUser.Put "pwdLastSet" , 0 Err.Clear If Trim(strPassword) <> "" Then objUser.SetPassword strPassword objUser.SetInfo intErr = Err.Number If intErr <> 0 Then Select Case intErr Case -2147022651, -2147016651 MsgBox "There was an error setting the p assword for '" & _ Trim(txtL3Username.Value) & "':" & vbCrL f & vbCrLf & _ "The password does not meet the password policy requirements. " & _ "Check the minimum password length, pass word complexity and " & _ "password history requirements, as state d in the Info section.", _ vbExclamation, "Error" Case Else MsgBox "There was an unspecified error s etting the password for '" & _

Trim(txtL3Username.Value) & "'", vbExcla mation, "Error" End Select Else MsgBox "The password for '" & Trim(txtL3Username .Value) & _ "' has now been amended.", vbInformation, "AD Ma nagement Utility" End If pwdL3Pwd.Value = "" txtL3Pwd.Value = "" cbxL3ForceChange.Checked = False cbxL3ShowPwd.Checked = False ShowPassword() ShowL3UserInfo(strUser) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ShowPassword() '# PURPOSE........: Shows the password in the password box '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ShowPassword() If cbxL3ShowPwd.Checked Then pwdL3Pwd.className = "hidden" txtL3Pwd.className = "infoTD" txtL3Pwd.Value = pwdL3Pwd.Value Else txtL3Pwd.className = "infoTD hidden" pwdL3Pwd.className = "infoTD" pwdL3Pwd.Value = txtL3Pwd.Value End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: CheckStrength(strPassword) '# PURPOSE........: Checks the strength of the password entered and '# displays info to user '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub CheckStrength(strPassword) Dim arrStrength(6) arrStrength(0) = "" arrStrength(1) = "Very Weak" arrStrength(2) = "Weak" arrStrength(3) = "Medium" arrStrength(4) = "Strong" arrStrength(5) = "Very Strong" intScore = 1 x = 0 L3Box01.style.color = "black"

If Len(strPassword) < 1 Then L3Box01.style.backgroundcolor = "white" L3Box01.Title = "" StrengthSpan.InnerHTML = arrStrength(0) Exit Sub End If If Len(strPassword) > 4 AND InStr(LCase(strPassword),"password") = 0 Then If Len(strPassword) >= 8 Then intScore = intScore + 1 End If If Len(strPassword) >= 12 Then intScore = intScore + 1 End If Set regex = New RegExp regex.Pattern = "\d+" If regex.Test(strPassword) Then x = x + 1 End If regex.Pattern = "[a-z]" If regex.Test(strPassword) Then x = x + 1 End If regex.Pattern = "[A-Z]" If regex.Test(strPassword) Then x = x + 1 End If regex.Pattern = ".[!,@,#,$,%,^,&,*,?,_,~,-,,(,)]" If regex.Test(strPassword) Then intScore = intScore + 1 x = x + 1 End If For i = 1 to Len(strPassword) z = 0 strTestLetter = LCase(Mid(strPassword, i, 1)) For y = 1 To Len(strPassword) If strTestLetter = LCase(Mid(strPassword , y, 1)) Then z = z + 1 End If Next pctTest = z / Len(strPassword) * 100 If pctTest > 40 Then If intScore <> 1 Then intScore = intScore - 1 Else x = 0 intScore = 1 End If End If If pctTest = 100 Then x = 0

intScore = 1 End If Next If x >= 2 Then intScore = intScore + 1 If intScore >= 5 Then intScore = 5 If Len(strPassword) < 12 AND intScore = 5 Then intScore = 4 If Len(strPassword) < 8 AND intScore > 3 Then intScore = 3 End If Select Case intScore Case 1 L3Box01.style.backgroundcolor Case 2 L3Box01.style.backgroundcolor Case 3 L3Box01.style.backgroundcolor Case 4 L3Box01.style.backgroundcolor Case 5 L3Box01.style.backgroundcolor L3Box01.style.color = "white" End Select

= "red" = "#FF9900" = "#FFFF00" = "99FF00" = "green"

L3Box01.Title = "Password Strength: " & arrStrength(intScore) StrengthSpan.InnerHTML = arrStrength(intScore) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ResetLayout3() '# PURPOSE........: Resets form for the UAC info '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub ResetLayout3() L3Enabled.InnerHTML = "&nbsp;" L3dtmLastLogon.InnerHTML = "&nbsp;" L3Locked.InnerHTML = "&nbsp;" L3dtmCreatedOn.InnerHTML = "&nbsp;" L3dtmChangedOn.InnerHTML = "&nbsp;" L3dtmPwdLastSet.InnerHTML = "&nbsp;" L3Name.InnerHTML = "&nbsp;" L3Phone.InnerHTML = "&nbsp;" L3Email.InnerHTML = "&nbsp;" L3PassStatus.InnerHTML = "&nbsp;" EditUserSpan.InnerHTML = "" pwdL3Pwd.Value = "" StrengthSpan.InnerHTML = "" cbxL3ForceChange.Checked = False cbxL3ShowPwd.Checked = False cbxL3DisableAcc.Checked = False cbxL3DisableAcc.Checked = False cbxL3UnlockAcc.Checked = False L3Enabled.className = "InfoTD disabled" L3dtmLastLogon.className = "InfoTD disabled"

L3Locked.className = "InfoTD disabled" L3dtmCreatedOn.className = "InfoTD disabled" L3dtmChangedOn.className = "InfoTD disabled" L3dtmPwdLastSet.className = "InfoTD disabled" L3Name.className = "InfoTD disabled" L3Phone.className = "InfoTD disabled" L3Email.className = "InfoTD disabled" StrengthSpan.style.color = "" pwdL3Pwd.className = "InfoTD disabled" txtL3Pwd.className = "InfoTD hidden" btnL3ResetPwd.className = "button disabled" cbxL3ForceChange.className = "checkbox disabled" cbxL3ShowPwd.className = "checkbox disabled" btnL3Commit.className = "button disabled" cbxL3DisableAcc.className = "checkbox disabled" cbxL3UnlockAcc.className = "checkbox disabled" btnL3Commit.className = "button disabled" btnL3Reset.className = "button disabled" btnL3PrintNow.className = "button disabled" L3Box10.InnerHTML = "Disable Account:" L3Box01.className = "L3 L3Upper L3Left L3Right disabled" L3Box01.style.backgroundcolor = "#eeeeee" L3Box02.className = "L3 L3Left disabled" L3Box03.className = "L3 L3Right disabled" L3Box04.className = "L3 L3Left L3Right disabled" L3Box05.className = "L3 L3Left L3Right disabled" L3Box06.className = "L3 L3Middle L3Left disabled" L3Box07.className = "L3 L3Middle disabled" L3Box08.className = "L3 L3Middle disabled" L3Box09.className = "L3 L3Middle L3Right disabled" L3Box10.className = "L3 L3Left disabled" L3Box11.className = "L3 disabled" L3Box12.className = "L3 L3Lower L3Left L3Right disabled" btnL3PrintNow.Title = "" btnL3Reset.Title = "" cbxL3DisableAcc.Title = "" cbxL3ShowPwd.Title = "" cbxL3ForceChange.Title = "" L3Name.Title = "" L3Phone.Title = "" L3Email.Title = "" L3dtmCreatedOn.Title = "" L3dtmChangedOn.Title = "" L3dtmPwdLastSet.Title = "" L3dtmLastLogon.Title = "" L3Enabled.Title = "" L3Locked.Title = "" EditUserSpan.Title = "" pwdL3Pwd.Title = "" btnL3ResetPwd.Title = "" btnL3Commit.Title = "" pwdL3Pwd.Disabled = True btnL3ResetPwd.Disabled = True cbxL3ForceChange.Disabled = True

cbxL3ShowPwd.Disabled = True btnL3Commit.Disabled = True cbxL3DisableAcc.Disabled = True cbxL3UnlockAcc.Disabled = True btnL3Commit.Disabled = True btnL3Reset.Disabled = True btnL3PrintNow.Disabled = True txtL3Username.Disabled = False txtL3Username.className = "text" txtL3Username.Value = "Username" txtL3Username.style.color = "#888888" btnL3Search.Disabled = False btnL3Search.className = "button" ChangeLayout(Layout3) End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ClearUsername(objUsernameItem) '# PURPOSE........: Clears the "Username" text onClick '# ARGUMENTS......: objUsernameItem = ID of username search box '# EXAMPLE........: ClearUsername(txtLUUsername) '# NOTES..........: '#-------------------------------------------------------------------------Sub ClearUsername(objUsernameItem) If Right(objUsernameItem.Value, 8) = "Username" OR Right(objUser nameItem.Value, 12) = "User / Group" Then objUsernameItem.style.color = "black" objUsernameItem.Value = "" End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: UnknownUserSearch(strInput, intSource) '# PURPOSE........: Performs search where unknown username entered, '# shows info in table on l eft of app '# ARGUMENTS......: strInput = Username entered '# intSource = Original rou tine '# EXAMPLE........: UnknownUserSearch("john", 1) '# NOTES..........: '#-------------------------------------------------------------------------Sub UnknownUserSearch(strInput, intSource) i = 0 strHTML = "<table style=""border-collapse:collapse;table-layout: fixed;"">" strHTML = strHTML & "<tr><th colspan=2 style=""background-color: black;color:white;"">" strHTML = strHTML & "<span style=""float:left;margin-left:125px; "">Search</span>" strHTML = strHTML & "<span style=""float:right;cursor:hand;margi n-right:10px;"" onClick=""CloseSearch(" & intSource & ")"" title=""Close"">X</sp an></th></tr>" Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection Set objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(&(objectClass=user)(|(sAMAccountName=*" & strInput & "*)(displayName=*" & strInput & "*)))" strAttributes = "distinguishedName,sAMAccountName,displayName,ob jectCategory" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False objCommand.Properties("Sort on") = "sAMAccountName" On Error Resume Next Set objRecordset = objCommand.Execute If objRecordset.EOF = True Then CloseSearch(intSource) MsgBox "No users have been found.", vbInformation, "AD M anagement Utility" Exit Sub End If booSearched = 1 Set objRecordset = objCommand.Execute Do Until objRecordset.EOF strUser = objRecordset.Fields("sAMAccountName").Value strName = objRecordset.Fields("displayName").Value objRecordset.MoveNext If NOT IsNull(strUser) AND NOT IsNull(strName) Then strNewUser = Replace(strUser, "'", "||") strNewUser = Replace(strNewUser, Chr(34), "{}") strNewUser = Replace(strNewUser, " ", "<>") strUser = Replace(strUser, "'", "") strUser = Replace(strUser, Chr(34), "") strName = Replace(strName, "'", "") strName = Replace(strName, Chr(34), "") strHTML = strHTML & "<tr>" strHTML = strHTML & "<td style=""backgroundcolor:white;border-left:1px solid black;border-bottom:1px solid black;"">" strHTML = strHTML & "<span class=""s panlink"" onClick='ShowSearchUser """ & strNewUser & """," & intSource & "' titl e=""Pick user '" & strUser & "'"">" & strUser & "</span>" strHTML = strHTML & "</td>" strHTML = strHTML & "<td style=""backgroundcolor:white;border-right:1px solid black;border-bottom:1px solid black;"">" strHTML = strHTML & strName strHTML = strHTML & "</td>"

strHTML = strHTML & "</tr>" i = i + 1 End If Loop objRecordset.Close strHTML = strHTML & "</table>" If intSource = 2 OR intSource = 4 Then GroupSelect.Disabled = True btnLGDelete.Disabled = True btnLGDelete.className = "button disabled" btnLGDelete.title = "" 'If GroupMembersSelect.Disabled = False Then GroupMember sSelect.Disabled = True End If UsernameSearchSpan.InnerHTML = strHTML If i > 1 Then UsernameSearchSpan.className = "" Else ShowSearchUser strNewUser, intSource End If objRecordset.Close End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: '# PURPOSE........: '# ARGUMENTS......: '# tine '# EXAMPLE........: '# NOTES..........: hsmi '#-------------------------------------------------------------------------Sub ShowSearchUser(strUser, intChoice) UsernameSearchSpan.className = "hidden" GroupSelect.Disabled = False btnLGDelete.Disabled = False btnLGDelete.className = "button" btnLGDelete.title = "Delete group" 'If GroupMembersSelect.Disabled = False Then GroupMembersSelect. Disabled = True strUser = Replace(strUser, "||", "'") strUser = Replace(strUser, "{}", Chr(34)) strUser = Replace(strUser, "<>", " ") Select Case intChoice Case 1 ShowUserInfo(strUser) Case 2 txtLGUsername2.Value = strUser ShowUserGroups() Case 3 ShowL3UserInfo(strUser) Case 4 CloseSearch("johsmi", 1) Above example would open Edit screen for user jo ShowSearchUser(strUser, intChoice) Shows the info for the chosen user strUser = Username intChoice = Original rou

txtLGUsername.Value = strUser AddGroupUser() End Select End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: CloseSearch(intChoice) '# PURPOSE........: Closes search box '# ARGUMENTS......: intChoice = Original routine '# EXAMPLE........: CloseSearch(1) '# NOTES..........: Above example would close search for Edit screen '#-------------------------------------------------------------------------Sub CloseSearch(intChoice) GroupSelect.Disabled = False btnLGDelete.Disabled = False btnLGDelete.className = "button" btnLGDelete.title = "Delete group" GroupMembersSelect.Disabled = False Select Case intChoice Case 1 txtLUUsername.Value = "Username" txtLUUsername.style.color = "#888888" Case 2 txtLGUsername2.Value = "Username" txtLGUsername2.style.color = "#888888" Case 3 txtL3Username.Value = "Username" txtL3Username.style.color = "#888888" Case 4 txtLGUsername.Value = "User / Group" txtLGUsername.style.color = "#888888" Case Else End Select UsernameSearchSpan.className = "hidden" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ClearListbox(objListbox) '# PURPOSE........: Clears specified listbox '# ARGUMENTS......: objListbox = name of listbox to clear '# EXAMPLE........: ClearListbox(EmailSelect) '# NOTES..........: '#-------------------------------------------------------------------------Sub ClearListbox(objListbox) For Each objOption In objListbox.Options objOption.RemoveNode Next End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: ChangeLayout(strLayout) '# PURPOSE........: Changes display to show required tab in app '# ARGUMENTS......: strLayout = html div to show '# EXAMPLE........: ChangeLayout(layout1) '# NOTES..........: '#--------------------------------------------------------------------------

Sub ChangeLayout(strLayout) loadingdiv.className = "hidden" layout1.className = "hidden" layout2.className = "hidden" layout3.className = "hidden" layoutuser.className = "hidden" layoutgroup.className = "hidden" layoutsettings.className = "hidden" UserTableSpan.className = "hidden" PCTableSpan.className = "hidden" GroupTableSpan.className = "hidden" UserExportOptionsSpan.className = "hidden" CloseExportScreen() CloseSearch(0) strLayout.className = "" End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: SetRootOU() '# PURPOSE........: Sets the Root OU for the search '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub SetRootOU() On Error Resume Next strOU = txtRootOU.Value If strOU = "" Then Exit Sub Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 1000 strBase = "<LDAP://" & strOU & ">" strFilter = "(&(objectclass=user)(objectcategory=person))" strAttributes = "adspath" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";s ubtree" objCommand.CommandText = strQuery Set objRecordSet = objCommand.Execute If objRecordset.EOF = True Then MsgBox "There are no users in the specified OU, or the O U has been entered " & _ "incorrectly.", vbInformation, "AD Management Utility" txtRootOU.Value = strRootOU Else strRootOU = strOU objShell.RegWrite "HKCU\Software\SKB\ADManagemen tUtil\Setup\strRootOU", _ strRootOU, "REG_SZ"

UserTableSpan.InnerHTML = "" PCTableSpan.InnerHTML = "" GroupTableSpan.InnerHTML = "" Set UserDataList = CreateObject("ADOR.Recordset" ) Set PCDataList = CreateObject("ADOR.Recordset") Set GroupDataList = CreateObject("ADOR.Recordset ") PopulateLayout1() ChangeLayout(Layout1) End If End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: GetDomain() '# PURPOSE........: Retrieves current domain and Root OU '# ARGUMENTS......: '# EXAMPLE........: '# NOTES..........: '#-------------------------------------------------------------------------Sub GetDomain() On Error Resume Next strVersion = objShell.RegRead("HKCU\Software\SKB\ADManagementUti l\Setup\strVersion") If strVersion < 1.2 Then strDomain = objShell.RegRead("HKCU\Software\SKB\ADEvalua tor\Setup\strDomain") strDNSDomain = objShell.RegRead("HKCU\Software\SKB\ADEva luator\Setup\strDNSDomain") strRootOU = objShell.RegRead("HKCU\Software\SKB\ADEvalua tor\Setup\strRootOU") If strDomain <> "" Then _ objShell.RegWrite "HKCU\Software\SKB\ADManagemen tUtil\Setup\strDomain", _ strDomain, "REG_SZ" If strDNSDomain <> "" Then _ objShell.RegWrite "HKCU\Software\SKB\ADManagemen tUtil\Setup\strDNSDomain", _ strDNSDomain, "REG_SZ" If strRootOU <> "" Then _ objShell.RegWrite "HKCU\Software\SKB\ADManagemen tUtil\Setup\strRootOU", _ strRootOU, "REG_SZ" objShell.RegDelete("HKCU\Software\SKB\ADEvaluator\Setup\ strDomain") objShell.RegDelete("HKCU\Software\SKB\ADEvaluator\Setup\ strDNSDomain") objShell.RegDelete("HKCU\Software\SKB\ADEvaluator\Setup\ strRootOU") objShell.RegDelete("HKCU\Software\SKB\ADEvaluator\Setup\ ") objShell.RegDelete("HKCU\Software\SKB\ADEvaluator\") End If strDomain = objShell.RegRead("HKCU\Software\SKB\ADManagementUtil

\Setup\strDomain") strDNSDomain = objShell.RegRead("HKCU\Software\SKB\ADManagementU til\Setup\strDNSDomain") strRootOU = objShell.RegRead("HKCU\Software\SKB\ADManagementUtil \Setup\strRootOU") objShell.RegWrite "HKCU\Software\SKB\ADManagementUtil\Setup\strV ersion", _ objADManage.Version, "REG_SZ" If strDomain = "" OR strDNSDomain = "" Then Set objNetwork = CreateObject("WScript.Network") strDomain = objNetwork.UserDomain Set objRootDSE = GetObject("LDAP://RootDSE") strDNSDomain = objRootDSE.Get("defaultNamingContext") objShell.RegWrite "HKCU\Software\SKB\ADManagementUtil\Se tup\strDomain", _ strDomain, "REG_SZ" objShell.RegWrite "HKCU\Software\SKB\ADManagementUtil\Se tup\strDNSDomain", _ strDNSDomain, "REG_SZ" End If If strRootOU = "" Then strRootOU = strDNSDomain objShell.RegWrite "HKCU\Software\SKB\ADManagementUtil\Se tup\strRootOU", _ strRootOU, "REG_SZ" End If txtRootOU.Value = strRootOU txtRootOU.title = "Root OU: " & strRootOU End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: PauseScript(intPause) '# PURPOSE........: Pauses the script '# ARGUMENTS......: intPause = number of milliseconds to pause '# EXAMPLE........: PauseScript(1000) '# NOTES..........: Above example will pause script for 1 second '#-------------------------------------------------------------------------Sub PauseScript(intPause) objShell.Run "%COMSPEC% /c ping -w " & intPause & " -n 1 1.0.0.0 ", 0, True End Sub '#------------------------------------------------------------------------'# SUBROUTINE.....: OpenURL(strURL) '# PURPOSE........: Opens the supplied URL in default browser '# ARGUMENTS......: strURL = URL '# EXAMPLE........: OpenURL("http://www.imdb.com/find?q=The_Social_N etwork" '# NOTES..........: Any spaces in URL must be encoded as underscores ( _ ) '#-------------------------------------------------------------------------Sub OpenURL(strURL) strURL = Replace(strURL, "_", " ")

objShell.Run(Chr(34) & strURL & Chr(34)) End Sub '#------------------------------------------------------------------------'# '# '# '# '# ---Sub OpenSettings() booDisableCount = objShell.RegRead("HKCU\Software\SKB\ADManageme ntUtil\Setup\booDisableCount") booShowListMsg = objShell.RegRead("HKCU\Software\SKB\ADManagemen tUtil\Setup\booShowListMsg") booOptimiseSearch = objShell.RegRead("HKCU\Software\SKB\ADManage mentUtil\Setup\booOptimiseSearch") booCacheGroups = objShell.RegRead("HKCU\Software\SKB\ADManagemen tUtil\Setup\booCacheGroups") If booDisableCount = 1 Then cbxDisableCount.Checked = True Else cbxDisableCount.Checked = False End If If booShowListMsg = 1 Then cbxShowListMsg.Checked = True Else cbxShowListMsg.Checked = False End If If booCacheGroups = 1 Then cbxCacheGroups.Checked = True Else cbxCacheGroups.Checked = False End If LSEfficiencySelect.Value = booOptimiseSearch ChangeLayout(LayoutSettings) End Sub '#------------------------------------------------------------------------'# '# '# '# '# ---Sub ChangeSettings(intChoice) On Error Resume Next Select Case intChoice Case 1 If cbxDisableCount.Checked = True Then booDisableCount = 1 Else booDisableCount = 0 End If objShell.RegWrite "HKCU\Software\SKB\ADManagemen SUBROUTINE.....: ChangeSettings() PURPOSE........: Opens Settings menu ARGUMENTS......: EXAMPLE........: NOTES..........: '#---------------------------------------------------------------------SUBROUTINE.....: OpenSettings() PURPOSE........: Opens Settings menu ARGUMENTS......: EXAMPLE........: NOTES..........: '#----------------------------------------------------------------------

tUtil\Setup\booDisableCount", _ booDisableCount, "REG_DWORD" RestartPrompt = MsgBox("This requires a restart of the app to become effective. " & _ vbCrLf & vbCrLf & "Do you wish to restart the ap p now?", vbQuestion+vbYesNo, "AD Management Utility") If RestartPrompt = vbYes Then Window.Close objShell.Run objADManage.commandLine Exit Sub End If Case 2 If cbxShowListMsg.Checked = True Then booShowListMsg = 1 Else booShowListMsg = 0 End If objShell.RegWrite "HKCU\Software\SKB\ADManagemen tUtil\Setup\booShowListMsg", _ booShowListMsg, "REG_DWORD" Case 3 booOptimiseSearch = LSEfficiencySelect.Value objShell.RegWrite "HKCU\Software\SKB\ADManagemen tUtil\Setup\booOptimiseSearch", _ booOptimiseSearch, "REG_DWORD" Case 4 If cbxCacheGroups.Checked = True Then booCacheGroups = 1 Else booCacheGroups = 0 End If objShell.RegWrite "HKCU\Software\SKB\ADManagemen tUtil\Setup\booCacheGroups", _ booCacheGroups, "REG_DWORD" End Select End Sub '#------------------------------------------------------------------------'# '# '# '# '# ---Sub Window_onLoad() self.ResizeTo 810,610 GetDomain() PauseScript(1) On Error Resume Next booDisableCount = objShell.RegRead("HKCU\Software\SKB\ADManageme ntUtil\Setup\booDisableCount") booShowListMsg = objShell.RegRead("HKCU\Software\SKB\ADManagemen tUtil\Setup\booShowListMsg") SUBROUTINE.....: Window_onLoad() PURPOSE........: Performs onLoad actions ARGUMENTS......: EXAMPLE........: NOTES..........: '#----------------------------------------------------------------------

booOptimiseSearch = objShell.RegRead("HKCU\Software\SKB\ADManage mentUtil\Setup\booOptimiseSearch") booCacheGroups = objShell.RegRead("HKCU\Software\SKB\ADManagemen tUtil\Setup\booCacheGroups") If booDisableCount = "" Then booDisableCount = 1 objShell.RegWrite "HKCU\Software\SKB\ADManagementUtil\Se tup\booDisableCount", _ booDisableCount, "REG_DWORD" End If If booShowListMsg = "" Then booShowListMsg = 1 objShell.RegWrite "HKCU\Software\SKB\ADManagementUtil\Se tup\booShowListMsg", _ booShowListMsg, "REG_DWORD" End If If booOptimiseSearch = "" Then booOptimiseSearch = 0 objShell.RegWrite "HKCU\Software\SKB\ADManagementUtil\Se tup\booOptimiseSearch", _ booOptimiseSearch, "REG_DWORD" End If If booCacheGroups = "" Then booCacheGroups = 0 objShell.RegWrite "HKCU\Software\SKB\ADManagementUtil\Se tup\booCacheGroups", _ booCacheGroups, "REG_DWORD" End If VersionSpan.InnerHTML = "Version " & objADManage.Version & "&nbs p;&nbsp;&nbsp;" & _ "Created by Stuart Barrett" SettingsLabel.className = "" PopulateLayout1() ChangeLayout(Layout1) strSortUserDataList = "sAMAccountName ASC" strSortPCDataList = "name ASC" strSortGroupDataList = "name ASC" ResetSortOrders(1) ResetSortOrders(2) ResetSortOrders(3) booUserSort = 2 booPCNameSort = 2 booGroupNameSort = 2 End Sub '#------------------------------------------------------------------------'# FUNCTION.......: EncodeCsv(strText) '# PURPOSE........: Encode provided text for CSV export '# ARGUMENTS......: strText = text to encode '# EXAMPLE........: EncodeCsv("Some text, etc.") '# NOTES..........: '#-------------------------------------------------------------------------Function EncodeCsv(strText)

strText = strText = strText = EncodeCsv End Function ----

Replace(strText, Chr(34), "") Replace(strText, VbCrLf, ", ") Chr(34) & strText & Chr(34) = strText

'#---------------------------------------------------------------------'# FUNCTION.......: Integer8Date(objDate, lngBias) '# PURPOSE........: Converts an Integer8 (64-bit) value to a date, '# adjusted for local time zone bias '# ARGUMENTS......: objDate = date value to be converted '# lngBias = local time zon e bias '# EXAMPLE........: Integer8Date(x, -60) '# NOTES..........: '#-------------------------------------------------------------------------Function Integer8Date(objDate, lngBias) lngAdjust = lngBias lngHigh = objDate.HighPart lngLow = objDate.LowPart 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 On Error Resume Next Integer8Date = CDate(lngDate) If Err.Number <> 0 OR Integer8Date = #1/1/1601# Then Integer8Date = 0 End If On Error GoTo 0 End Function </script> <body> <div id="LoadingDiv"> <table id="sublayout"> <tr><td class="layoutheader" style="text-decoration:none;font-si ze:1.3em">Loading, please wait...</td></tr> </table> </div> <div id="TopBar"> <span id="SettingsLabel" class="hidden" style="color:blue;cursor:hand;" onClick="OpenSettings()" title="Open Settings menu">Settings</span>&nbsp;&nbsp;< span id="VersionSpan">&nbsp;</span> </div> <div id="Layout1" class="hidden"> <table id="sublayout1"> <tr><td class="layoutheader">Active Directory Settings</td></tr> <tr>

<td style="width:50%;vertical-align:top;"> <table> <tr> <td> Domain Name: </td> <td> <span id="L1strDomain">& nbsp;</span> </td> </tr> <tr> <td> Root DN: </td> <td> <span id="L1strDNSDomain ">&nbsp;</span> </td> </tr> <tr><td colspan=2>&nbsp;</td></tr> <tr> <td> Lockout Threshold: </td> <td> <span id="L1strLockoutTh reshold" title="The number of failed logon attempts that causes a user account t o be locked out">&nbsp;</span> </td> </tr> <tr> <td> Max Password Age: </td> <td> <span id="L1strMaxPwdAge Days" title="The number of days that a password can be used before the system re quires the user to change it">&nbsp;</span> </td> </tr> <tr> <td> Min Password Age: </td> <td> <span id="L1strMinPwdAge Days" title="The number of days that a password must be used before the user can change it">&nbsp;</span> </td> </tr> <tr> <td> Min Password Length: </td> <td> <span id="L1strMinPwdLen gth" title="The least number of characters that a password for a user account ma y contain">&nbsp;</span> </td>

</tr> <tr> <td> Password History: </td> <td> <span id="L1strPwdHistor yLength" title="The number of unique new passwords that have to be associated wi th a user account before an old password can be reused">&nbsp;</span> </td> </tr> <tr> <td> Password Complexity Poli cy: </td> <td> <span id="L1strPasswordC omplex" title="Determines whether passwords must meet set complexity requirement s.">&nbsp;</span> </td> </tr> <tr><td colspan=2>&nbsp;</td></tr> <tr> <td colspan=2> <span id="L1strLockOutOb servationWindowMinutes">&nbsp;</span> </td> </tr> <tr> <td colspan=2> <span id="L1strLockoutDu rationMinutes">&nbsp;</span> </td> </tr> </table> </td> <td style="width:50%;vertical-align:top;"> <table> <tr> <td> Total OUs: </td> <td> <span id="L1intNumOUs">& nbsp;</span> </td> </tr> <tr> <td> Total Users: </td> <td> <span id="L1intNumUsers" class="spanlink" onClick="ShowTable(1)" style="text-decoration:none;" title="Sh ow a list of all users in AD">&nbsp;</span> </td> </tr> <tr> <td>

Total Groups: </td> <td> <span id="L1intNumGroups " class="spanlink" onClick="ShowTable(3)" style="text-decoration:none;" title="S how a list of all groups in AD">&nbsp;</span> </td> </tr> <tr> <td> Total Computers: </td> <td> <span id="L1intNumPCs" c lass="spanlink" onClick="ShowTable(2)" style="text-decoration:none;" title="Show a list of all computers in AD">&nbsp;</span> </td> </tr> <tr><td colspan=2>&nbsp;</td></tr> <tr> <td> Last User Created: </td> <td> <span id="L1strLastUserC reated" class="spanlink" onClick="ReloadLayoutUser(strLastUserCreated)">&nbsp;</ span> </td> </tr> </table> </td> </tr> </table> <span class="bottommenuright"> <input class="button" type="button" value="REFRESH" style="widt h:100;" name="btnL1Refresh" onClick="RefreshLayout1()" title="Refresh AD Info" o nMouseOver="btnL1Refresh.className='button btnhov'" onMouseOut="btnL1Refresh.cla ssName='button'"> &nbsp;&nbsp;&nbsp; </span> </div> <div id="LayoutUser" class="hidden"> <table id="sublayout2"> <tr><td class="layoutheader">View / Update User Info</td></tr> <tr> <td style="width:55%;vertical-align:top;"> <table> <tr> <td style="vertical-align:bottom ;"> Display Name: </td> </tr> <tr> <td> <input type="text" name= "txtLUDispName" size="53" title="Display Name" disabled=true class="text disable d"> </td>

</tr> <tr> <td style="vertical-align:bottom ;"> Title: </td> </tr> <tr> <td> <input type="text" name= "txtLUTitle" size="53" title="Title" disabled=true class="text disabled"> </td> </tr> <tr> <td style="vertical-align:bottom ;"> <span style="float:left; "> Telephone: </span> <span style="color:red;f ont-size:0.9em;float:right;"> Example: +44 (12 34) 567890 </span> </td> </tr> <tr> <td> <input type="text" name= "txtLUPhN" size="53" title="Telephone" disabled=true class="text disabled"> </td> </tr> <tr> <td style="vertical-align:bottom ;"> <span style="float:left; "> Mobile Phone: </span> <span style="color:red;f ont-size:0.9em;float:right;"> Example: +44 (72 34) 567890 </span> </td> </tr> <tr> <td> <input type="text" name= "txtLUMobile" size="53" title="Mobile Phone" disabled=true class="text disabled" > </td> </tr> <tr> <td style="vertical-align:bottom ;"> Email Address: </td>

</tr> <tr> <td> <select name="EmailSelec t" style="width:262;" onChange="SelectEmailAdd()" class="disabled" disabled=true ></select> <input type="text" name= "txtLUEmailAdd" size="41" title="Email Address" class="text hidden" style="margi n-right:7px;"> <span id="EmailLabel" cl ass="spanlink" style="text-decoration:none;" onClick="ChangeEmailType()"></span> &nbsp; <span id="DelProxyLabel" onClick="DeleteProxyAddress()" class="redbold" style="cursor:hand;"></span> </td> </tr> <tr> <td style="vertical-align:bottom ;" id="LUDelgateLabeltd"> Distinguished Name: </td> </tr> </table> </td> <td style="width:45%;vertical-align:top;"> <table> <tr> <td colspan=2 style="vertical-al ign:bottom;"> Street Address: </td> </tr> <tr> <td colspan=2> <input type="text" name= "txtLUAdd" size="52" title="Street Address" disabled=true class="text disabled"> </td> </tr> <tr> <td colspan=2 style="vertical-al ign:bottom;"> City: </td> </tr> <tr> <td colspan=2> <input type="text" name= "txtLUCity" size="52" title="City" disabled=true class="text disabled"> </td> </tr> <tr> <td colspan=2 style="vertical-al ign:bottom;"> County: </td> </tr> <tr> <td colspan=2> <input type="text" name= "txtLUCounty" size="52" title="Office" disabled=true class="text disabled">

</td> </tr> <tr> <td colspan=2 style="vertical-al ign:bottom;"> Postcode: </td> </tr> <tr> <td colspan=2> <input type="text" name= "txtLUPostcode" size="52" title="Postcode" disabled=true class="text disabled"> </td> </tr> <tr> <td colspan=2 style="vertical-al ign:bottom;"> Other: </td> </tr> <tr> <td style="width:30%;"> <select name="LUOtherSel ect" disabled=true class="disabled" onChange="GetOtherInfo()" title="Other Field s" style="width:110;"> <option value="0 "> </option> <option value="g ivenName"> First Na me </option> <option value="s n"> Surname </option> <option value="c ompany"> Company </option> <option value="c o"> Country </option> <option value="d epartment"> Departme nt </option> <option value="f acsimileTelephoneNumber"> Fax Numb er </option> <option value="d escription"> Descript ion </option>

<option value="p hysicalDeliveryOfficeName"> Office </option> </select> </td> <td> <input type="text" name= "txtLUCustom" size="30" disabled=true class="text disabled"> </td> </tr> <tr> <td style="vertical-align:bottom ;" id="LUDelgateLabel2td"> &nbsp; </td> </tr> </table> </td> </tr> <tr> <td colspan=2 id="LUDNtd"> <span id="LUDNSpan" class="LUDNSpan disabled" ti tle="Distinguished Name"> &nbsp; </span> </td> <td id="LUDelegatetd" class="hidden"> &nbsp; </td> <td id="LUDelegateBLtd" class="hidden"> &nbsp; </td> </tr> </table> <span class="bottommenuleft"> &nbsp;&nbsp;&nbsp; <input class="button" type="button" value="UPDATE" style="width: 100;" name="btnLUUpdateInf" onClick="UpdateUserInfo()" onMouseOver="btnLUUpdateI nf.className='button btnhov'" onMouseOut="btnLUUpdateInf.className='button'"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input class="button" type="button" value="DELEGATES" style="wid th:100;" name="btnLUDelegates" onClick="ToggleDelegates()" onMouseOver="btnLUDel egates.className='button btnhov'" onMouseOut="btnLUDelegates.className='button'" > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input class="button" type="button" value="PRINT" style="width:6 0;border-right:0px;" name="btnLUPrintNow" onClick="window.print()" onMouseOver=" btnLUPrintNow.className='button btnhov'" onMouseOut="btnLUPrintNow.className='bu tton'"><input class="button" type="button" value="RESET" style="width:60;" name= "btnLUReset" onClick="ResetLayoutUser()" title="Reset form" onMouseOver="btnLURe set.className='button btnhov'" onMouseOut="btnLUReset.className='button'"> </span> <span class="bottommenuright"> <span id="ViewUACSpan" class="spanlink" onClick="ShowL3UserInfo( txtLUUsername.Value)"></span> <p style="margin-top:5px;"> <input type="text" name="txtLUUsername" size="20" title= "Username" class="text" style="border-width:2px;border-right:0px;height:27;color :#888888;" value="Username" onFocus="ClearUsername(txtLUUsername)"><input class=

"button" type="button" value="SEARCH" style="width:60;" name="btnLUSearch" onCli ck="ShowUserInfo(txtLUUsername.Value)" title="Search username" onMouseOver="btnL USearch.className='button btnhov'" onMouseOut="btnLUSearch.className='button'"> &nbsp;&nbsp;&nbsp; </p> </span> </div> <div id="LayoutGroup" class="hidden"> <table id="sublayout4"> <tr><td class="layoutheader">Manage Groups</td></tr> <tr> <td rowspan=2> <p> <input type="text" name="txtLGFilter" si ze="40" class="text" style="border-width:2px;height:27;border-right:0px;color:#8 88888;" onFocus="ClearFilterText()" onKeyUp="FilterGroups()" value="Filter...">< input class="button" type="button" value="CLEAR" style="width:75;" name="btnLGCl earFilter" onClick="ResetLayoutGroup()" onMouseOver="btnLGClearFilter.className= 'button btnhov'" onMouseOut="btnLGClearFilter.className='button'" title="Clear f ilter"> </p> <p style="font-weight:bold;float:left;">Groups</ p> <p id="L1intGroups" style="font-weight:bold;floa t:right;margin-right:5px;"></p> <select name="GroupSelect" size="15" style="widt h:100%;height:auto;" onChange="ShowMembers()"></select> <select name="GroupFilterSelect" size="15" style ="width:100%;height:auto;" onChange="ShowFilterMembers()" class="hidden"></selec t> <table style="width:100%"><tr><td> <span style="display:block;"> <p style="float:left;"> <input class="button" type="butt on" value="RELOAD" style="width:90;" name="btnLGReload" onClick="ReloadGroups()" onMouseOver="btnLGReload.className='button btnhov'" onMouseOut="btnLGReload.cla ssName='button'" title="Reload cached groups"> </p> <p style="float:right;"> <input class="button" type="butt on" value="DELETE" style="width:90;" name="btnLGDelete" onClick="DeleteGroup()" onMouseOver="btnLGDelete.className='button btnhov'" onMouseOut="btnLGDelete.clas sName='button'"> </p> </span> </td></tr> <tr><td> <span style="font-weight:bold;">Description</spa n><br /> <span id="GroupDescSpan" style="height:40;width: 100%;overflow:auto;padding:5px;">&nbsp;</span></td></tr></table> </td> <td style="vertical-align:top;"> <p style="font-weight:bold;float:left;">Members< /p> <p id="L1intMembers" style="font-weight:bold;flo at:right;margin-right:5px;"></p> <select name="GroupMembersSelect" size="8" style

="width:100%;height:auto;" onChange="ChooseMember()" onDblClick="ChangeGroup(1)" class="disabled"></select> <p style="float:left;"> <input class="button disabled" type="but ton" value="REMOVE" style="width:100;" name="btnLGRemove" onClick="RemoveGroupUs er()" onMouseOver="btnLGRemove.className='button btnhov'" onMouseOut="btnLGRemov e.className='button'" disabled=true> </p> <p style="float:right;"> <input type="text" name="txtLGUsername" size="20" class="text disabled" style="border-width:2px;height:27;color:#888888; border-right:0px" value="User / Group" onFocus="ClearUsername(txtLGUsername)" di sabled=true><input class="button disabled" type="button" value="ADD" style="widt h:60;" name="btnLGAdd" onClick="AddGroupUser()" onMouseOver="btnLGAdd.className= 'button btnhov'" onMouseOut="btnLGAdd.className='button'" disabled=true> </p> </td> </tr> <tr> <td style="vertical-align:bottom;"> <p style="font-weight:bold;float:left;">User Gro up Membership</p> <p id="L1intGroupMembership" style="font-weight: bold;float:right;margin-right:5px;"></p> <select name="UserGroupsSelect" size="8" style=" width:100%;height:auto;" onChange="ChooseUserGroup()" class="disabled" onDblClic k="ChangeGroup(2)"></select> <p style="float:left;"> <input class="button disabled" type="but ton" value="REMOVE" style="width:100;" name="btnLGRemove2" onClick="RemoveUserGr oup()" onMouseOver="btnLGRemove2.className='button btnhov'" onMouseOut="btnLGRem ove2.className='button'" disabled=true> </p> <p style="float:right;"> <input type="text" name="txtLGUsername2" size="20" title="Username" class="text" style="border-width:2px;height:27;color :#888888;border-right:0px" value="Username" onFocus="ClearUsername(txtLGUsername 2)" onKeyDown="ResetGroupMemberships()"><input class="button" type="button" valu e="SEARCH" style="width:60;" name="btnLGUserSearch" onClick="ShowUserGroups()" t itle="View group memberships for user" onMouseOver="btnLGUserSearch.className='b utton btnhov'" onMouseOut="btnLGUserSearch.className='button'"> </p> </td> </tr> </table> <span class="bottommenuleft"> &nbsp;&nbsp;&nbsp; <input class="button" type="button" value="RESET" style="width:9 0;" name="btnLGReset" onClick="ResetLayoutGroup()" onMouseOver="btnLGReset.class Name='button btnhov'" onMouseOut="btnLGReset.className='button'" title="Reset fo rm"> </span> </div> <div id="LayoutSettings" class="hidden"> <table id="sublayout5"> <tr><td class="layoutheader">Settings</td></tr> <tr>

<td>Disable AD counts on Info menu (requires app restart )</td> <td><input type="checkbox" name="cbxDisableCount" onClic k="ChangeSettings(1)" title="Disable AD counts and Last Created user on Info men u to make opening app quicker (requires app restart)"></td> </tr> <tr> <td>Show Warning message on opening List menu</td> <td><input type="checkbox" name="cbxShowListMsg" onClick ="ChangeSettings(2)" title="Show Warning message on opening List menu to eradica te opening it by accident thus hanging the app in large domains"></td> </tr> <tr> <td>Cache Group Names</td> <td><input type="checkbox" name="cbxCacheGroups" onClick ="ChangeSettings(4)" title="Cache group info so that they will not be pulled fro m AD on opening the Groups menu"></td> </tr> <tr> <td>Optimise searches for</td> <td> <select name="LSEfficiencySelect" title="Choose how to optimise searches" onChange="ChangeSettings(3)" style="width:150;"> <option value=0 title="Optimise for quic ker searches - on searching a username with a near duplicate in AD only the firs t will be shown">Quicker Searches</option> <option value=1 title="Optimise for bett er search results - on searching a username with a near duplicate in AD all will be shown but it will take longer to process">Better Results</option> </select> </td> </tr> <tr> </table> <br /> <hr style="width:90%;" /> <br> <table><tr><td> Thank you for using my AD Management Utility, created with love (and a little bit of code!) <p> If you find it useful and feel like making a donation... well, you can't, so just bask in the glory of the fact that you're such a wonde rful person that you actually thought about it, and let's face it.. it's the tho ught that counts! </p> </td></tr></table> <span id="SpiceworksGush" title="I heart Spiceworks!"> For more scripts like this and a whole plethora of other IT good ness please head on over to the <a href="#" style="font-weight:bold" title="http ://www.spiceworks.com/community" onClick="OpenURL('http://www.spiceworks.com/com munity')">Spiceworks Community</a> where you will be welcomed like an old <span style="font-weight:bold;" title="Spicehead (n) - the name given to a user of Spi ceworks">Spicehead!</span> <p> Also please take a look at the <a href="#" style="font-w eight:bold" title="http://www.spiceworks.com" onClick="OpenURL('http://www.spice works.com/referrer/stubar')">Spiceworks app</a>, if you're in IT you need this " Everything IT" tool in your life!

</p> </span> </div> <div id="Layout2" class="hidden"> <select name="L2TypeSelect" title="Choose the ange="ShowTable(L2TypeSelect.Value)" style="width:150;"> <option value=1 title="Show a list of sers</option> <option value=2 title="Show a list of D">Computers</option> <option value=3 title="Show a list of Groups</option> </select> &nbsp;&nbsp; <select name="ExportSelect" title="Export the list" onChange="Ex portDetails()" style="width:150;"> <option value="0">Export to:</option> <option value="1" title="Export list to a Comma Seperate d Values (csv) file">Export to csv</option> <option value="2" title="Export list to an Excel (xls) f ile">Export to xls</option> <option value="3" title="Export list to a Web page (html ) file">Export to html</option> </select> &nbsp;&nbsp; <input class="button" type="button" value="REFRESH" style="width :100;height:23px" name="btnL2Refresh" onClick="RefreshTableData()" onMouseOver=" btnL2Refresh.className='button btnhov'" onMouseOut="btnL2Refresh.className='butt on'" title="Refresh data in current list view"> <br /> </div> <span id="UserExportOptionsSpan" class="hidden"> <table style="width:100%;border-bottom:1px solid black;"> <tr> <th style="color:white;background-color:black;"> <span style="float:left;margin-left:145px;">Expo rt</span> <span style="float:right;cursor:hand;margin-righ t:10px;" onClick="CloseExportScreen()" title="Close">X</span> </th> </tr> </table> <form name="UserExportForm" method="post"> <table style="width:100%;margin-top:0px;"> <tr> <td> <table> <tr> <td>Username</td> <td><input type="checkbo x" disabled=true checked=true></td> </tr> data to show" onCh all users in AD">U all computers in A all groups in AD">

<tr> <td>Display Name</td> <td><input type="checkbo x" name="cbxDispNameX"></td> </tr> <tr> <td>First Name</td> <td><input type="checkbo x" name="cbxFirstNameX"></td> </tr> <tr> <td>Surname</td> <td><input type="checkbo x" name="cbxSurnameX"></td> </tr> <tr> <td>Title</td> <td><input type="checkbo x" name="cbxTitleX"></td> </tr> <tr> <td>Telephone</td> <td><input type="checkbo x" name="cbxTelephoneNumberX"></td> </tr> <tr> <td>Mobile</td> <td><input type="checkbo x" name="cbxMobileX"></td> </tr> <tr> <td>Fax No</td> <td><input type="checkbo x" name="cbxFaxNoX"></td> </tr> <tr> <td>Email</td> <td><input type="checkbo x" name="cbxEmailX"></td> </tr> <tr> <td>Description</td> <td><input type="checkbo x" name="cbxDescriptionX"></td> </tr> </table> </td> <td> <table> <tr> <td>Street Address</td> <td><input type="checkbo x" name="cbxStreetAddressX"></td> </tr> <tr> <td>City</td> <td><input type="checkbo x" name="cbxCityX"></td> </tr> <tr>

<td>County</td> <td><input type="checkbo x" name="cbxCountyX"></td> </tr> <tr> <td>Postcode</td> <td><input type="checkbo x" name="cbxPostcodeX"></td> </tr> <tr> <td>Country</td> <td><input type="checkbo x" name="cbxCountryX"></td> </tr> <tr> <td>Office</td> <td><input type="checkbo x" name="cbxOfficeX"></td> </tr> <tr> <td>Department</td> <td><input type="checkbo x" name="cbxDepartmentX"></td> </tr> <tr> <td>Company</td> <td><input type="checkbo x" name="cbxCompanyX"></td> </tr> <tr> <td>DN</td> <td><input type="checkbo x" name="cbxDNX"></td> </tr> </table> </td> </tr> <tr> <td style="height:23px;vertical-align:bottom;"> <span style="width:60%;text-align:center "> <a href="#" title="Check all opt ions" onClick="CheckUserExport(1)" style="color:blue">All</a> &nbsp;&nbsp; <a href="#" title="Uncheck all o ptions" onClick="CheckUserExport(0)" style="color:blue">None</a> </span> </td> <td style="text-align:center;"> <input class="button" type="button" valu e="Done" style="width:90;" name="btnUserOptionsDone" onClick="ExportDetails()" o nMouseOver="btnUserOptionsDone.className='button btnhov'" onMouseOut="btnUserOpt ionsDone.className='button'" title="Export using selected fields"> </td> </tr> </table> </form> </span> <span id="UserTableSpan" class="hidden"></span>

<span id="PCTableSpan" class="hidden"></span> <span id="GroupTableSpan" class="hidden"></span> <div id="Layout3" class="hidden"> <table id="sublayout3"> <tr><td class="layoutheader">User Account Control</td></tr> <tr> <td style="width:55%;vertical-align:top;padding-top:2px; "> <table class="controltable"> <tr> <td style="width:35%;"> Display Name: </td> <td id="L3Name" class="infoTD di sabled" style="font-weight:bold;"> &nbsp; </td> </tr> <tr> <td> Last Logon: </td> <td id="L3dtmLastLogon" class="i nfoTD disabled"> &nbsp; </td> </tr> <tr> <td style="width:35%;"> Email: </td> <td id="L3Email" class="infoTD d isabled" style="font-weight:bold;"> &nbsp; </td> </tr> <tr> <td style="width:35%;"> Telephone: </td> <td id="L3Phone" class="infoTD d isabled" style="font-weight:bold;"> &nbsp; </td> </tr> <tr><td colspan=2>&nbsp;</td></tr> <tr><td colspan=2>&nbsp;</td></tr> <tr> <td> Created On: </td> <td id="L3dtmCreatedOn" class="i nfoTD disabled"> &nbsp; </td> </tr> <tr> <td> Last Modified:

</td> <td id="L3dtmChangedOn" class="i nfoTD disabled"> &nbsp; </td> </tr> <tr> <td> Password Set: </td> <td id="L3dtmPwdLastSet" class=" infoTD disabled"> &nbsp; </td> </tr> <tr><td colspan=2>&nbsp;</td></tr> <tr> <td> Status: </td> <td id="L3Enabled" class="infoTD disabled"> &nbsp; </td> </tr> <tr> <td> Locked Status: </td> <td id="L3Locked" class="infoTD disabled"> &nbsp; </td> </tr> <tr><td colspan=2>&nbsp;</td></tr> <tr> <td colspan=2 id="L3PassStatus"> &nbsp; </td> </tr> </table> </td> <td style="width:45%;padding-top:2px;"> <table class="controltable"> <tr> <td style="width:25%;height:20px ;">&nbsp;</td> <td style="width:20%;height:20px ;">&nbsp;</td> <td style="width:15%;height:20px ;">&nbsp;</td> <td style="width:30%;height:20px ;">&nbsp;</td> <td style="width:10%;height:20px ;">&nbsp;</td> </tr> <tr><td <tr><td <tr><td <tr><td colspan=5>&nbsp;</td></tr> colspan=5>&nbsp;</td></tr> colspan=5>&nbsp;</td></tr> colspan=5>&nbsp;</td></tr>

<tr> <td id="L3Box01" class="L3 L3Upp er L3Left L3Right disabled" colspan=5 style="text-align:center;"> <span id="StrengthSpan" style="font-weight:bold;">&nbsp;</span> </td> </tr> <tr> <td id="L3Box02" class="L3 L3Lef t disabled" style="height:35px;"> Password: </td> <td id="L3Box03" class="L3 L3Rig ht disabled" colspan=4> <input id="pwdL3Pwd" typ e="password" class="infoTD disabled" style="width:160;border-right:0px;verticalalign:middle;" onKeyUp="CheckStrength(pwdL3Pwd.value)" disabled=true><input id=" txtL3Pwd" type="text" class="infoTD hidden" style="width:160;border-right:0px;ve rtical-align:middle;" onKeyUp="CheckStrength(txtL3Pwd.value)"><input class="butt on disabled" type="button" value="SET" style="width:60;height:23px;vertical-alig n:middle;" name="btnL3ResetPwd" onClick="ResetPassword()" onMouseOver="btnL3Rese tPwd.className='button btnhov'" onMouseOut="btnL3ResetPwd.className='button'" di sabled=true> </td> </tr> <tr> <td id="L3Box04" class="L3 L3Lef t L3Right disabled" colspan=5 style="text-align:right;height:30px;"> <span style="float:left" > Show:&nbsp;&nbsp ;<input type="checkbox" id="cbxL3ShowPwd" class="checkbox disabled" onClick="Sho wPassword()" disabled=true> </span> <span style="float:right :"> Force change at logon:&nbsp;&nbsp;<input type="checkbox" id="cbxL3ForceChange" class="checkbox d isabled" disabled=true> </span> </td> </tr> <tr><td id="L3Box05" class="L3 L3Left L3 Right disabled" colspan=5 style="height:15px">&nbsp;</td></tr> <tr> <td id="L3Box06" class="L3 L3Lef t L3Middle disabled" colspan=2 style="height:45px;"> Unlock Account: </td> <td id="L3Box07" class="L3 L3Mid dle disabled"> <input type="checkbox" i d="cbxL3UnlockAcc" disabled=true class="checkbox disabled"> </td> <td id="L3Box08" rowspan=2 class ="L3 L3Middle disabled" style="text-align:center;"> <input class="button dis abled" type="button" value="COMMIT" style="width:60;height:53px" name="btnL3Comm it" onClick="CommitL3Action()" onMouseOver="btnL3Commit.className='button btnhov '" onMouseOut="btnL3Commit.className='button'" disabled=true>

</td> <td id="L3Box09" rowspan=2 class ="L3 L3Middle L3Right disabled"> &nbsp; </td> </tr> <tr> <td id="L3Box10" class="L3 L3Lef t disabled" colspan=2 style="height:34px;"> Disable Account: </td> <td id="L3Box11" class="L3 L3Rig ht disabled"> <input type="checkbox" i d="cbxL3DisableAcc" disabled=true class="checkbox disabled"> </td> </tr> <tr><td id="L3Box12" class="L3 L3Lower L 3Left L3Right disabled" colspan=5 style="height:10px;">&nbsp;</td></tr> </table> </td> </tr> </table> <span class="bottommenuleft"> &nbsp;&nbsp;&nbsp; <input class="button disabled" type="button" value="PRINT" style ="width:60;border-right:0px;" name="btnL3PrintNow" onClick="window.print()" onMo useOver="btnL3PrintNow.className='button btnhov'" onMouseOut="btnL3PrintNow.clas sName='button'" disabled=true><input class="button disabled" type="button" value ="RESET" style="width:60;" name="btnL3Reset" onClick="ResetLayout3()" onMouseOve r="btnL3Reset.className='button btnhov'" onMouseOut="btnL3Reset.className='butto n'" disabled=true> </span> <span class="bottommenuright"> <span id="EditUserSpan" class="spanlink" onClick="ReloadLayoutUs er(txtL3Username.Value)"></span> <p style="margin-top:5px;"> <input type="text" name="txtL3Username" size="20" title= "Username" class="text" style="border-width:2px;height:27;color:#888888;border-r ight:0px" value="Username" onFocus="ClearUsername(txtL3Username)"><input class=" button" type="button" value="SEARCH" style="width:60;" name="btnL3Search" onClic k="ShowL3UserInfo(txtL3Username.Value)" title="Search username" onMouseOver="btn L3Search.className='button btnhov'" onMouseOut="btnL3Search.className='button'"> &nbsp;&nbsp;&nbsp; </p> </span> </div> <span id="UsernameSearchSpan" class="hidden" onBlur="UsernameSearchSpan.classNam e='hidden'"> &nbsp; </span> <div> <span style="float:left;"> <input class="button" type="button" value="Info" style="width:90 ;border-right:0px;" name="btnL1" onClick="ChangeLayout(Layout1)" onMouseOver="bt nL1.className='button btnhov'" onMouseOut="btnL1.className='button'" title="Retr ieve info regarding the AD environment"><input class="button" type="button" valu e="List" style="width:90;border-right:0px;" name="btnL2" onClick="ShowTable(0)"

onMouseOver="btnL2.className='button btnhov'" onMouseOut="btnL2.className='butto n'" title="Show a list of all objects in Active Directory"><input class="button" type="button" value="Edit" style="width:90;border-right:0px;" name="btnLU" onCl ick="ResetLayoutUser()" onMouseOver="btnLU.className='button btnhov'" onMouseOut ="btnLU.className='button'" title="View / change an individual user's informatio n"><input class="button" type="button" value="Groups" style="width:90;border-rig ht:0px;" name="btnLG" onClick="ResetLayoutGroup()" onMouseOver="btnLG.className= 'button btnhov'" onMouseOut="btnLG.className='button'" title="View / change grou p membership information"><input class="button" type="button" value="Control" st yle="width:90;" name="btnL3" onClick="ResetLayout3()" onMouseOver="btnL3.classNa me='button btnhov'" onMouseOut="btnL3.className='button'" title="User Account Co ntrol"> </span> <span style="float:right;font-weight:bold;vertical-align:middle;"> Root OU: <input type="text" style="border:2px solid black;height :27px;border-right:0px;" name="txtRootOU" size="25" title="Root OU"><input class ="button" type="button" value="Set" style="width:50;" name="btnSetRootOU" onClic k="SetRootOU()" onMouseOver="btnSetRootOU.className='button btnhov'" onMouseOut= "btnSetRootOU.className='button'" title="Set Root OU"> </span> </div> </body> </html>

You might also like