I wrote this script because, having just implemented AD, I couldn't figure out how to navigate the ADsPath for scripting purposes. You can use this to browse your Active Directory and find out what the fully-qualified ADsPath of an object is.

I hope you find it useful when you're writing ADSI scripts and can't remember the right path to the container or OU that you're trying to get to.

(P.S. It also shows off the new tabcontrols.)

Code:

Break On

; === Main Form ========================================================
$frmMain = CreateObject("Kixtart.Form")
$frmMain.ClientSize = 640,480
$frmMain.FormBorderStyle = 4
$frmMain.Icon = "shell32.dll;42"

$imgList = $frmMain.Controls.ImageList
$imgList.ColorDepth = 16
For $i = 0 To $frmMain.SmallImageList.Images.Count
$imgList.Images.Add($frmMain.SmallImageList.Images($i))
Next

If Exist("%WINDIR%\System32\dsuiext.dll")
$c=$imgList.Images.Add("dsuiext.dll;1")
$g=$imgList.Images.Add("dsuiext.dll;7")
$u=$imgList.Images.Add("dsuiext.dll;12")
$o=$imgList.Images.Add("dsuiext.dll;13")
$ux=$imgList.Images.Add("dsuiext.dll;27")
$ul=$imgList.Images.Add(".\user_locked_16.ico")
$f=$imgList.Images.Add("dsquery.dll;0")
$frmMain.Icon = $imgList.Images($f)
Else
$c=53 $g=35 $u=34 $o=50
EndIf

$imgLarge = $frmMain.Controls.ImageList
$imgLarge.ImageSize = 32,32
For $i = 0 To $imgList.Images.Count
$imgLarge.Images.Add($imgList.Images($i))
Next

$MsgBox = $frmMain.Dialogs.MessageBox
$MsgBox.Title = "Information..."
$MsgBox.Style = 68

$txtCopy = $frmMain.Controls.TextBox("",0,0,0,0)
$txtCopy.Hide
; ======================================================================

; === ToolBar ==========================================================
$grpToolBar = $frmMain.GroupBox("",0,0,$frmMain.ClientWidth,30)
$grpToolBar.Anchor = 7

$btnBack = $grpToolBar.ToolButton("Back",2,2,60,26)
$btnBack.FlatStyle = 1
$btnBack.Icon = 18
$btnBack.OnClick = "fnOnBack()"
$btnBack.ToolTipText = "Back"

$btnRefresh = $grpToolBar.ToolButton("",$btnBack.Right,2,26,26)
$btnRefresh.FlatStyle = 1
$btnRefresh.Icon = 36
$btnRefresh.OnClick = "fnRefresh()"
$btnRefresh.ToolTipText = "Refresh"

$btnCopy = $grpToolBar.ToolButton("",$btnRefresh.Right,2,26,26)
$btnCopy.FlatStyle = 1
$btnCopy.Icon = 7
$btnCopy.OnClick = "fnCopy()"
$btnCopy.ToolTipText = "Copy current container to clipboard"

$btnView = $grpToolBar.ToolButton("",$btnCopy.Right,2,26,26)
$btnView.FlatStyle = 1
$btnView.Icon = 41
$btnView.OnClick = "fnView()"
$btnView.ToolTipText = "Cycle view options"

$btnCancel = $grpToolBar.ToolButton("Cancel",$grpToolBar.ClientWidth-62,2,60,26)
$btnCancel.Anchor = 4
$btnCancel.FlatStyle = 1
$btnCancel.Icon = 37
$btnCancel.OnClick = "$$btnCancel.Tag = 1"
$btnCancel.ToolTipText = "Cancel Enumeration"
; ======================================================================

; === Container Tabs ===================================================
$tabMain = $frmMain.Controls.TabControl("",0,$grpToolBar.Bottom+1,$frmMain.ClientWidth,
$frmMain.ClientHeight-30)
$tabMain.Anchor = 15
$tabMain.OnSelectedIndexChanged = "fnOnTabChange()"

$frmMain.Text = "LDAP://"+GetObject("LDAP://rootDSE").Get("defaultNamingContext")
$objDomain = GetObject($frmMain.Text)

For Each $objContainer in $objDomain
$TabPage = $tabMain.TabPages.Add(Split($objContainer.Name,"=")[1])

$ListView = $TabPage.Controls.ListView("",0,0,$TabPage.ClientWidth,$TabPage.ClientHeight-25)
$ListView.Anchor = 15
$ListView.LargeImageList = $imgLarge
$ListView.SmallImageList = $imgList
$ListView.Name = "ListView"
$ListView.OnDoubleClick = "fnOnDoubleClick()"
$ListView.Tag = $objContainer.ADsPath
$nul = $ListView.Columns.Add("Name",0.35*$ListView.ClientWidth)
$nul = $ListView.Columns.Add("AD_Name",0)
$nul = $ListView.Columns.Add("Class",0.25*$ListView.ClientWidth)
$nul = $ListView.Columns.Add("Description",0.40*$ListView.ClientWidth)

; === Status Bar ===================================================
$grpStatusBar = $TabPage.Controls.GroupBox("",1,$ListView.Bottom+3,$TabPage.ClientWidth-1,20)
$grpStatusBar.Anchor = 13
$grpStatusBar.BorderStyle = 0

$lblStatus = $grpStatusBar.Controls.Label("",0,0,0.45*$grpStatusBar.ClientWidth,20)
$lblStatus.Anchor = 1
$lblStatus.BorderStyle = 5
$lblStatus.Name = "lblStatus"

$prgProgress = $grpStatusBar.Controls.ProgressBar("",$lblStatus.Right+1,0,0.55*$grpStatusBar.ClientWidth-1,20)
$prgProgress.BorderStyle = 5
$prgProgress.Step = 1
$prgProgress.Anchor = 5
$prgProgress.Name = "prgProgress"
; ======================================================================
Next
; ======================================================================

$frmMain.Center
$frmMain.Show

While $frmMain.Visible
$=Execute($frmMain.DoEvents())
Loop

Exit(1)

Function fnOnTabChange(Optional $Folder)
Dim $objContainer
If $tabMain.SelectedIndex <> -1
If InStr($lblStatus.Text,"Enumerating") $lblStatus.Text = "" $prgProgress.Value = 0 EndIf
$ListView = $tabMain.TabPages($tabMain.SelectedIndex).Controls("ListView")
$lblStatus = $tabMain.TabPages($tabMain.SelectedIndex).Controls("lblStatus")
$prgProgress = $tabMain.TabPages($tabMain.SelectedIndex).Controls("prgProgress")
If $ListView.Items.Count = 0
$frmMain.Cursor = 11 $lblStatus.Text = "" $prgProgress.Maximum = 0
$objContainer = GetObject($ListView.Tag)
For Each $object in $objContainer $prgProgress.Maximum = $prgProgress.Maximum+1 Next
$lblStatus.Text = "Enumerating "+$prgProgress.Maximum+" objects..."
$btnCancel.Enabled = 1
For Each $object in $objContainer
If $ListView.Tag <> $objContainer.ADsPath or $btnCancel.Tag = 1 GOTO SkipEnum EndIf
Select
Case $object.Class = "organizationalUnit" $Icon = $o
Case $object.Class = "user" And $object.AccountDisabled $Icon = $ux
Case $object.Class = "user" And $object.IsAccountLocked $Icon = $ul
Case $object.Class = "user" $Icon = $u
Case $object.Class = "group" $Icon = $g
Case $object.Class = "computer" $Icon = $c
Case 1 $Icon = 45
EndSelect
$Item = $ListView.Items.Add(Split($object.Name,"=")[1],$Icon)
$Item.SubItems(1).Text = $object.Name
$Item.SubItems(2).Text = $object.Class
$Item.SubItems(3).Text = $object.PasswordLastChanged ;$object.Description
$prgProgress.PerformStep
$=Execute($frmMain.DoEvents(1))
Next
:SkipEnum
$btnCancel.Tag = 0 $btnCancel.Enabled = 0 $frmMain.Cursor = 0 $prgProgress.Value = 0
EndIf
Select
Case $ListView.View = 0 $btnView.Icon = 38
Case $ListView.View = 1 $btnView.Icon = 39
Case $ListView.View = 2 $btnView.Icon = 40
Case $ListView.View = 3 $btnView.Icon = 41
EndSelect
If $tabMain.TabPages($tabMain.SelectedIndex).Tag = ""
$tabMain.TabPages($tabMain.SelectedIndex).Tag = $ListView.Tag
$frmMain.Text = $ListView.Tag
EndIf
$lblStatus.Text = Split(Split($ListView.Tag,"=")[1],",")[0]+": "+$ListView.Items.Count+" object(s) listed"
$frmMain.Text = $ListView.Tag
$btnBack.Tag = $ListView.Tag
If $btnBack.Tag = $tabMain.TabPages($tabMain.SelectedIndex).Tag
$btnBack.Enabled = 0
Else
$btnBack.Enabled = 1
EndIf
EndIf
EndFunction

Function fnOnDoubleClick()
Dim $sItemADsPath
$sItemADsPath = "LDAP://"+$ListView.FocusedItem.SubItems(1).Text+","+Split($ListView.Tag,"//")[1]
$txtCopy.Text = $sItemADsPath
If $ListView.FocusedItem.SubItems(2).Text = "organizationalUnit" or
$ListView.FocusedItem.SubItems(2).Text = "container"
$ListView.Tag = $sItemADsPath
$ListView.Items.Clear
fnOnTabChange()
Else
If $MsgBox.Show($sItemADsPath+@CRLF+@CRLF+"Copy to clipboard?") = 6
$txtCopy.SelectionLength = Len($txtCopy.Text)
$txtCopy.Copy
EndIf
EndIf
EndFunction

Function fnOnBack()
Dim $aItemADsPath,$sItemADsPath
$aItemADsPath = Split(Split($ListView.Tag,"//")[1],",")
For $i = 1 to Ubound($aItemADsPath)
$sItemADsPath = $sItemADsPath + $aItemADsPath[$i] + ","
Next
$sItemADsPath = "LDAP://" + Left($sItemADsPath,LEN($sItemADsPath)-1)
$ListView.Tag = $sItemADsPath
$ListView.Items.Clear
fnOnTabChange()
EndFunction

Function fnRefresh()
$ListView.Items.Clear
fnOnTabChange()
EndFunction

Function fnCopy()
$txtCopy.Text = $ListView.Tag
$txtCopy.SelectionLength = Len($txtCopy.Text)
$txtCopy.Copy
EndFunction

Function fnView()
$ListView.View = $ListView.View + 1
Select
Case $ListView.View = 0 $btnView.Icon = 38
Case $ListView.View = 1 $btnView.Icon = 39
Case $ListView.View = 2 $btnView.Icon = 40
Case $ListView.View = 3 $btnView.Icon = 41
EndSelect
EndFunction



Edited by Chris S. (2004-01-07 02:29 PM)