UsersView.ps1

В PowerShell 2.0 много превосходных нововведений (о некоторых из которых уже было рассказано например тут или тут), но не стоит откладывать изучение PowerShell до выхода второй версии. Даже PS 1.0 обладает отличным функционалом, что и доказывает следующий пример🙂

Это скрипт-утилитка для отображения объектов из AD (в данном случае контактов, но можно подставить что угодно) в красивом списке, с возможностью быстрого поиска, и выводом дополнительной информации. Мне показалось что это удобнее настроенной консоли MMC, да и установки adminpack не требует😉

Searcher

Правда текст скрипта вместе с обильными комментариями для блога IMHO несколько великоват, так что на всякий случай вот ссылка на файл — UsersView.ps1.

#Путь к OU в котором ищем объекты
$Path = "OU=Contacts,DC=Domain,DC=Ru"
#Фильтр LDAP для отбора нужных объектов - в данном случае только контакты
$Filter = '(objectClass=Contact)'
#Следует ли обновлять список после каждой введенной буквы в поле поиска
#При большом количестве объектов лучше отключить, тогда поиск будет происходить при нажатии Enter
$SearchOnType = $True

#Подгружаем сборку для работы с окнами и графическими элементами
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
#Функция для заполнения списка с фильтрацией по маске
function Fill-List ($Mask = "*")
{
    #Очищаем список
    $List.Items.Clear()
    #Для каждого ключа в таблице, если он подпадает под маску...
    $Table.Keys | where {$_ -like $Mask} | foreach {
        #Добавляем элемент в список
        $I = $List.Items.Add($_)
        #Добавляем подэлемент (почтовый адрес) для показа во втором столбце
        $I.SubItems.Add($Table[$_].mail) | Out-Null
    }
}

#Создаем объект для запроса в Active Directory
$Selector = New-Object System.DirectoryServices.DirectorySearcher
#Задаем путь по которому искать объекты
$Selector.SearchRoot = [ADSI]"LDAP://$Path"
#Задаем фильтр
$Selector.Filter = $Filter
#Запускаем поиск, и помещаем результаты в переменную $Contacts
$Contacts = $Selector.FindAll()

#Создаем хеш-таблицу для временного хранения объектов
$Table = @{}
#Для всех объектов полученных из запроса
$Contacts | foreach {
    #Получаем объект Directory Entry в переменную $e
    $e = $_.GetDirectoryEntry()
    #Если на объекте не стоит галка "Hide from Exchange address list"...
    if (-not $e.msExchHideFromAddressLists)
    {
        #Помещаем объект в таблицу, используя в качестве ключа имя
        $Table["$($e.Name)"] = $e
    }
}

#Создаем форму и элементы управления
$Form = New-Object system.Windows.Forms.Form
$List = New-Object System.Windows.Forms.ListView
$txtSearch = New-Object System.Windows.Forms.TextBox
$txtInfo = New-Object System.Windows.Forms.TextBox
#Помещаем элементы на форму
$Form.Controls.add($List)
$Form.Controls.add($txtSearch)
$Form.Controls.add($txtInfo)
#И настраиваем их свойства
$Form.Text = "Контакты"
$Form.Width = 450
$Form.Height = 600
$txtInfo.dock = "Bottom"
$txtInfo.Height = 60
$txtInfo.ReadOnly = $True
$txtInfo.Multiline = $True
$List.dock = "Fill"
$List.View = "Details"
$List.MultiSelect = $false
$List.Sorting = "Ascending"
$List.Columns.Add("Имя").width = 200
$List.Columns.Add("E-Mail").width = 200
$txtSearch.dock = "Top"

#Если ищем при любом изменении текста в поле поиска...
if ($SearchOnType)
{
    #Добавляем обработчик на событие TextChanged, который выполняет функцию Fill-List
    $txtSearch.add_TextChanged({Fill-List ("*" + $txtSearch.Text + "*")})
}
else #Ищем только при нажатии Enter
{
    #Скриптблок (кусок исполняемого кода) который будет выполнен при нажатии клавиши в поле поиска
    $SB_KeyPress = {
        #Если была нажата клавиша Enter (13) то...
        if (13 -eq $_.keychar)
        {
            #Вызываем функцию Fill-List
            Fill-List ("*" + $txtSearch.Text + "*")
        }
    }
    #Добавляем обработчик на событие KeyPress, указав в качестве выполняемого кода $SB_KeyPress
    $txtSearch.add_KeyPress($SB_KeyPress)
}

#Скриптблок выполняющийся при выборе элемента в списке
$SB_SelectionChanged = {
    if( $list.SelectedItems )
    {
    #Получаем из $Table объект, используя в качестве ключа имя элемента
    $de = $Table[$list.SelectedItems[0].text]
    #Заполняем txtInfo данными из объекта
    $txtInfo.Text = @"
Имя: $($de.name)`r
Телефон: $($de.telephoneNumber)`r
E-Mail: $($de.mail)`r
Организация: $($de.company)`r
"@
    }
}
#Привязываем обработчик к событию выбора элемента списка
$List.add_SelectedIndexChanged($SB_SelectionChanged)
#Заполняем список первый раз для показа всех элементов
Fill-List
#Показываем окно
$Form.ShowDialog()

Если у вас будет очень много элементов в списке, и мгновенный поиск при вводе буквы будет мешать, то стоит установить в начале скрипта переменную $SearchOnType = $False. Тогда поиск будет производится только при нажатии Enter.

Опубликовано в Active Directory, Learn, PowerShell, Practice, Scripting, Tips. Комментарии к записи UsersView.ps1 отключены
%d такие блоггеры, как: