В таблице всегда есть строка с именем Default. Ее любят использовать программы на VB6 для доступа к COM-объектам. Клиентские программы на C++ обычно пользуются именованными данными. Default-значения в среде разработки VB6 срабатывают по двойному щелчку, реализуя сценарий: "Я не знаю что это такое, но, все равно, работай" и это похоже на чудо, так как объект сам показывает (или рассказывает), что он имеет и/или умеет.
Для того, чтобы найти в сундуке интересующие нас данные, придется основательно порыться. Начните с адреса:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards
Здесь вы видите свои сетевые карты (их может быть несколько). Среди значений одного из ключей (соответствующего выбранной вами карте) найдите значение с именем ServiceName. Оно отправляет нас к сервису, который работает с картой. Его надо искать в другой ветви реестра, которая соответствует имени сервиса. Например:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\имя сервиса
Если карта встроена в материнскую плату (мой случай), то алгоритм поиска другой. Сначала найдите ключ:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Adapters\
Найденный ключ может иметь несколько ветвей, некоторые из них представляют собой 128-битовые, уникальные идентификаторы сетевых адаптеров. Далее надо искать номера этих адаптеров в ветви реестра:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\номер адаптера
Таблица значений этого ключа (если выбран активный адаптер, то есть, задействованный в данный момент), содержит интересующую нас информацию. IP-адрес вы обнаружите в виде значения с именем DhcpIPAddress, маску подсети—в виде значения с именем DhcpSubnetMask, и т. д. Чтобы слегка поворошить сундук и осознать (нет, скорее, почувствовать) связи между его жителями, просмотрите ключ:
HKLM\SYSTEM\ControlSet001\Control\Network\
В эту ветвь вложена ветвь, которая является идентификатором материнской платы. Внутрь нее вложены идентификаторы сетевых соединений. Одно из них содержит знакомый вам номер. Просмотрите адрес:
HKLM\SYSTEM\ControlSet001\Services\номер адаптера\Parameters\Tcpip
Он тоже содержит искомую информацию, но в сокращенном виде.
В пространстве имен Microsoft.Win32 библиотеки классов .NET Framework есть два класса позволяющие манипулировать записями реестра, это—Registry и RegistryKey. Класс Registry дает доступ к полям данных (объектам класса RegistryKey), соответствующим главным ветвям реестра: ClassesRoot, CurrentUser, LocalMachine, Users, CurrentConfig.
В реестре есть раздел PerformanceData. Он—виртуальный, попытка обратиться к нему провоцирует систему собрать информацию о производительности. Счетчики производительности (Performance Counters) и управление ими является еще одной из (сокрытых во мраке COM) технологий Microsoft. В Windows 98 и Me, кроме указанных разделов, существует раздел DynData.
Покажем, как получить сетевую информацию с помощью методов указанных классов. Метод GetSubKeyNames класса RegistryKey позволяет получить массив имен всех ключей какой-либо ветви реестра. Например, вызов: string[] names=Registry.ClassesRoot.GetSubKeyNames(); в моей системе возвращает более 7000 строк. В основном это информация об установленных COM-объектах. Следующий фрагмент показывает, как получить из реестра и вывести сетевую информацию (в случае, когда сетевая карта встроена в материнскую плату).
public static void Main()
{
Console.WriteLine("\tNetwork Info\n");
string tcp = @"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters";
RegistryKey adapterKey = Registry.LocalMachine.OpenSubKey (tcp + @"\Adapters\");
if (adapterKey == null)
{
Console.WriteLine("Bad registry key"); return;
}
foreach (string adapter in adapterKey.GetSubKeyNames())
{
RegistryKey key = Registry.LocalMachine.OpenSubKey (tcp + @"\Interfaces\" + adapter);
if (key != null)
{
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.