2015-03-27 5 views
1

Я создаю сценарий на основе графического интерфейса, который, когда пользователь вводит имя пользователя, извлекает файл журнала с разделителями-запятыми с информацией, такой как дата и время входа в систему, машина, в которую они вошли и т. д. В качестве части графического интерфейса я хотел бы использовать TreeView для представления им списка MAC-адресов, в которые вошло имя пользователя, в которое они вошли. В некоторых случаях существует много дубликатов, для разных периодов времени в течение года. Я хотел бы иметь возможность отображать уникальные экземпляры в качестве родительских узлов, а затем для каждого повторяющегося экземпляра добавить его в качестве дочернего узла в соответствующий родительский узел вместе с тем временем, когда они вошли в систему.Создание родительских и дочерних узлов с древовидной структурой и повторяющимися строками

У меня есть то, что я думаю, является частью решения, добавлением уникальных узлов и его работой, как я ожидал, но мне довольно сложно добавить дублирующие узлы в качестве дочерних узлов к соответствующим родительским узлам.

Ех: если пользователь вошел в имя хоста COMP1, 6 раз в течение файла журнала, я хочу отобразить COMP1 в качестве родительского узла, и если пользователи нажимают на символ +, они будут видеть 6 экземпляров, перечисленных ниже, с помощью дата собственности прилагается.

Вот пример из файла журнала .CSV, свойства в верхней строке:

Date,EventType,ConnectionType,UserDomain,UserLogonTime,LogonType,HostName,HostAddress,HostStartTime,RemoteStationName,RemoteStationAddress 
3/24/2015 12:49:58 PM,Logon,Local,DOMAIN,3/24/2015 12:49:13 PM,CONSOLE,F0A8F0B01660,10.10.10.11,3/24/2015 12:27:15 PM,N/A,N/A 
3/26/2015 12:32:56 PM,TS Session Connected,Remote-RDP,DOMAIN,3/24/2015 7:13:19 AM,CONSOLE,VFP3077V,10.10.10.10,3/23/2015 6:56:32 AM,Dingus,10.10.96.72 

Свойства Я выбирая из файла журнала являются имя хоста и дата.

Вот некоторые из моего текущего кода:

$array = Import-Csv $filepath\$username.txt | Where-Object {$_.EventType -eq "TS Session Connected" -or $_.EventType -eq "Logon"} | select -ExpandProperty  hostname | sort -Unique 

$array2 = Import-Csv $filepath\$username.txt | Where-Object {$_.EventType -eq "TS Session Connected" -or $_.EventType -eq "Logon"} | select -ExpandProperty Date | sort -Unique 

#Loops through and singles out each host name, and adds it as a treenode 
for ($i = 0; $i -lt $array.Count; $i++) { 
$node = $treeviewHostnames.Nodes.Add($array[$i]) | Out-Null 
} 

TreeView объект:

$treeviewHostnames = New-Object System.Windows.Forms.TreeView 
$treeviewHostnames.size = New-Object drawing.Size @(300,378) 
$treeviewHostnames.Location = New-Object drawing.Size @(380,165) 
$treeviewHostnames.Scrollable = $true 

Это добавляет уникальный список имен хостов для моего объекта TreeView, но у меня трудное время, добавляя конкретные повторяющиеся дочерние имена хостов для уникальных родительских имен хостов.

+0

У вас случайно есть образец данных для использования, поэтому нам не нужно изобретать велосипед? – Matt

+0

Обновленный оригинальный пост, полностью забыл включить данные из журнала, спасибо! – dingusxmcgee

ответ

0

Это была решена благодаря Дэну на Powershell.org

Его пример .CSV:

HostName,LastLogon 
COMP1,032820151913 
COMP1,032720151913 
COMP2,032820151913 
COMP2,032720151913 

Его код:

function Add-Node { 
    param 
    ( 
     $RootNode, 
     $HostName, 
     $LastLogon 
    ) 

    $newNode = new-object System.Windows.Forms.TreeNode 
    $newNode.Name = "$HostName -- $LastLogon" 
    $newNode.Text = "$HostName -- $LastLogon" 

    If(($RootNode.Nodes | Foreach-Object {$_.Tag}) -contains $HostName) 
    { 
     $HostNode = $RootNode.Nodes | ?{$_.Tag -eq $HostName} 
    } 
    Else 
    { 
     $newHostNode = new-object System.Windows.Forms.TreeNode 
     $newHostNode.Name = $HostName 
     $newHostNode.Text = $HostName 
     $newHostNode.Tag = $HostName 

     $Null = $RootNode.Nodes.Add($newHostNode) 
     $HostNode = $RootNode.Nodes | ?{$_.Tag -eq $HostName} 
    } 

    $Null = $HostNode.Nodes.Add($newNode) 
    } 

    $Form = New-Object system.Windows.Forms.Form 
    $Form.Text = "TreeView" 

    $TreeView = New-Object System.Windows.Forms.TreeView 
    $System_Drawing_Size = New-Object System.Drawing.Size 
    $System_Drawing_Size.Width = 224 
    $System_Drawing_Size.Height = 200 
    $TreeView.Size = $System_Drawing_Size 

    $System_Drawing_Point = New-Object System.Drawing.Point 
    $System_Drawing_Point.X = 13 
    $System_Drawing_Point.Y = 37 
    $TreeView.Location = $System_Drawing_Point 

    $Form.Controls.Add($TreeView) 

    $TreeNode = New-Object -TypeName System.Windows.Forms.TreeNode -ArgumentList 'Computers' 
    $TreeNode.Tag = 'Computers' 

    $CSV = Import-CSV .\LogonInfo.txt 

    Foreach($Computer in $CSV) 
    { 
Add-Node -RootNode $TreeNode -HostName $Computer.HostName -LastLogon $Computer.LastLogon 
    } 

    $Null = $TreeView.Nodes.Add($TreeNode) 

    $TreeView.ExpandAll() 
    $Form.ShowDialog() 

Его объяснение: Что делает этот скрипт в основном 1. Настройте простую форму для отображения TreeNode в TreeView 2. Добавьте корневое дерево Node tagged Computers, мы добавим все компьютеры в этот TreeNode . 3. Импортируем файл CSV. 4. Прокрутите CSV и добавьте узел для компьютера в CSV. Функция Add-Node проверяет наличие дочернего узла с тегом, который равен имени хоста компьютера, если он есть, мы просто добавляем информацию о входе в этот узел. Если это не так, мы создаем новый дочерний узел, используя имя компьютера. Затем мы выбираем этот вновь созданный узел, чтобы добавить информацию о входе в систему. 5. Наконец, скрипт расширяет все узлы и отображает форму.

Надеюсь, это полезно.

Благодарен Дэну за помощь!