我正在创建一个基于GUI的脚本,当用户输入用户名时,它会检索逗号分隔的日志文件,其中包含登录的日期和时间,他们登录的计算机等信息。 作为GUI的一部分,我想使用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
}
树视图对象:
$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 :(得分:0)
感谢Dan在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.设置一个简单的表单以在TreeView中显示TreeNode 2.添加标记为计算机的根TreeNode,我们将所有计算机添加到此TreeNode 3.导入CSV文件 4.循环CSV并在CSV中添加一台foreach计算机节点。 Add-Node函数检查是否存在标记等于计算机主机名的子节点,如果存在,我们只需将登录信息添加到该节点。如果不是,我们使用计算机的主机名创建一个新的子节点。接下来,我们选择新创建的节点来添加登录信息。 5.最后,脚本展开所有节点并显示表单。
希望这有用。
感谢Dan的帮助!