Сложная локальная сеть с различными подсетями представляет собой разветвленную структуру, которую можно отнести к графу. Компьютеры и маршрутизаторы представляются как узлы графа, а связи между ними – ребра графа.
Как же это знание поможет нам отобразить локальную сеть?
Существует прекрасная бесплатная библиотека для работы с графами – QuickGraph. Работа с графами в этой библиотека реализована очень просто.
Импортируем пространство имен:
Объявляем граф:
Как ранее было сказано, компьютеры – это узлы нашего графа. Добавляем узел:
Список компьютеров мы возьмем из Active Directory:
Замечательно, но полученный результат получился мало похожим на граф. У нас отсутствуют связи между узлами.
Как известно все компьютеры имеют общие точки, с которыми они связаны – маршрутизаторы (роутеры). Возможен вариант, когда локальная сеть не имеет маршрутизатора, но в этом случае ее визуализация достаточно проста.
Каждый компьютер сети напрямую связан с маршрутизатором, адрес которого прописан как шлюз в свойствах сетевой платы компьютера.
Пройдясь по компьютерам при помощи WMI…
… получим список всех шлюзов. Добавим их в граф, так же как и компьютеры:
Одновременно с добавлением узлов, добавим связь между компьютером и шлюзом:
Вот теперь мы получили граф, но только не визуальный.
QuickGraph поддерживает MSAGL, GLEE и Graphviz для визуализации графов, но мы воспользуемся Graph#. Данный фреймворк содержит различные алгоритмы для визуализации графов в WPF приложениях.
Размещаем на форме GraphLayuot контрол из данного фреймворка и пишем простую строку для отображения созданного нами ранее графа:
И это все, что нам нужно. Все остальное возьмет на себя Graph#.
Ссылки:
QuickGraph
Graph#
Как же это знание поможет нам отобразить локальную сеть?
QuickGraph
Существует прекрасная бесплатная библиотека для работы с графами – QuickGraph. Работа с графами в этой библиотека реализована очень просто.
Импортируем пространство имен:
Imports QuickGraph
Объявляем граф:
Dim graph As New BidirectionalGraph(Of Object, IEdge(Of Object))
Как ранее было сказано, компьютеры – это узлы нашего графа. Добавляем узел:
graph.AddVertex("ИмяКомпьютера")
Список компьютеров мы возьмем из Active Directory:
Dim de As New DirectoryServices.DirectoryEntry
Dim search As New DirectorySearcher(de)
search.Filter = "(objectCategory=computer)"
Dim results As SearchResultCollection = search.FindAll()
For i As Integer = 0 To results.Count - 1
Dim de2 As DirectoryEntry = results(i).GetDirectoryEntry
Dim ComputerName As String = CType(de2.InvokeGet("cn"), String)
graph.AddVertex(ComputerName)
Next
Замечательно, но полученный результат получился мало похожим на граф. У нас отсутствуют связи между узлами.
Как известно все компьютеры имеют общие точки, с которыми они связаны – маршрутизаторы (роутеры). Возможен вариант, когда локальная сеть не имеет маршрутизатора, но в этом случае ее визуализация достаточно проста.
Каждый компьютер сети напрямую связан с маршрутизатором, адрес которого прописан как шлюз в свойствах сетевой платы компьютера.
Пройдясь по компьютерам при помощи WMI…
Private Function GetGateway(ByVal ComputerName As String) As String
Dim s As String = String.Empty
Dim query As ManagementObjectSearcher
Dim queryCollection As ManagementObjectCollection
Dim msc As ManagementScope = New ManagementScope("\\" + ComputerName + "\root\cimv2")
query = New ManagementObjectSearcher(msc, New SelectQuery("SELECT * FROM Win32_NetworkAdapterConfiguration"))
queryCollection = query.Get()
For Each mObject As ManagementObject In queryCollection
Try
If mObject("DefaultIPGateway").ToString <> "" Then
s = mObject("DefaultIPGateway")(0).ToString
End If
Catch
End Try
Next
Return s
End Function
… получим список всех шлюзов. Добавим их в граф, так же как и компьютеры:
graph.AddVertex("ИмяШлюза")
Одновременно с добавлением узлов, добавим связь между компьютером и шлюзом:
graph.AddEdge(New Edge(Of Object)("ИмяКомпьютера", "ИмяШлюза"))
Вот теперь мы получили граф, но только не визуальный.
Graph#
QuickGraph поддерживает MSAGL, GLEE и Graphviz для визуализации графов, но мы воспользуемся Graph#. Данный фреймворк содержит различные алгоритмы для визуализации графов в WPF приложениях.
Размещаем на форме GraphLayuot контрол из данного фреймворка и пишем простую строку для отображения созданного нами ранее графа:
GraphLayout.Graph = graph
И это все, что нам нужно. Все остальное возьмет на себя Graph#.
Ссылки:
QuickGraph
Graph#