Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];

Вниз

Как включить/выключить подключение по локальной сети? Варианты...   Найти похожие ветки 

 
AlexTitov   (2008-04-28 13:25) [0]

Реально зашел в тупик, т.к. ни один известный мне метод полноценно не работает.
Нужно из программы включать/выключать сетевое подключение, например "Подключение по локальной сети".
Итак, пойдем по порядку:
1. WMI. В Win32_NetworkAdapter есть Enable/Disable, но, как написано на MSDN - это только для Windows Vista. Проверил, так оно и есть :( Не подходит, нужно поддерживать как минимум Windows 2000/XP/Vista.
2. Выключение/включение устройства (сетевой платы). Этот вариант уже более-менее работает на нужных версиях Windows, но не подходит, т.к. это совсем другое, чем пункты выключить/включить сетевое подключение. Даже при выключенном сетевом подключении я в WMI вижу нужную информацию, но если я удалю устройство - то я уже ничего не смогу показать, как-будто ни одной сетевой платы и нет.
3. ShellAPI. Смысл в том, что программа будет незаметно нажимать пункты контекстного меню включить/выключить для нужного подключения. На текущий момент это единственный работающий способ, который я смог найти. НО, использовать его совсем нет желания, т.к. считаю этот способ кривым. Аргументирую: в зависимости от языка интерфейса Windows пункты названы по-разному. Чтобы было понятнее, то вот код:
function ToggleLAN(const ConnectionName: string): Boolean;
const
 EnableVerb = "В&ключить";
 DisableVerb = "&Отключить";
 LANEnable: Boolean = True;
var
 ShellApp: Shell32_tlb.Shell;
 ControlPanel: Shell32_tlb.Folder;
 FolderItem: Shell32_tlb.FolderItem;
 NetworkFolder: Shell32_tlb.Folder;
 LANConnection: Shell32_tlb.FolderItem;
 EnableVerbItem, DisableVerbItem, Verb : Shell32_tlb.FolderItemVerb;
 I,K: Integer;
begin
 Result := False;
 ShellApp := CoShell.Create;
 ControlPanel := ShellApp.NameSpace(ssfCONTROLS);
//  test := ConnectionName;
 for I := 0 to ControlPanel.Items.Count - 1 do
 begin
   FolderItem := ControlPanel.Items.Item(I);
//    ShowMessage(FolderItem.Name);
   if (FolderItem.Name = "Сетевые подключения") or
     (FolderItem.Name = "Network and Dial-up Connections") or
    (FolderItem.Name = "Network and Sharing Center") then
   begin
     NetworkFolder := FolderItem.GetFolder as Folder;
     Break;
   end;
 end;
 if NetworkFolder = nil then
 begin
   Result := False;
   Exit;
 end;
 for I := 0 to NetworkFolder.Items.Count - 1 do
 begin
   FolderItem := NetworkFolder.Items.Item(I);
//    ShowMessage(FolderItem.Name);
   if FolderItem.Name = ConnectionName then
   begin
     LANConnection := FolderItem;
     Break;
   end;
 end;

 if LANConnection = nil then
 begin
   Result := False;
   Exit;
 end;

for I := 0 to LANConnection.Verbs.Count - 1 do
 begin
//  showmessage(LANConnection.Verbs.Item(I).Name);
   if LANConnection.Verbs.Item(I).Name = EnableVerb then
   begin
     EnableVerbItem := LANConnection.Verbs.Item(I);
     EnableVerbItem.DoIt;
     Break;
       Result := True;
   end
   else if LANConnection.Verbs.Item(I).Name = DisableVerb then
   begin
     DisableVerbItem := LANConnection.Verbs.Item(I);
    DisableVerbItem.DoIt;
     Break;
       Result := True;
   end;
 end;

4. Использование MIB_IF_ADMIN_STATUS_UP и MIB_IF_ADMIN_STATUS_DOWN. Тесты и документация показали, что эти способы работают, НО, при этом очень криво. Если я устанавливаю MIB_IF_ADMIN_STATUS_DOWN, то никакие пакеты через сетевую карту не идут, но при этом в системе/WMI/моей программе она имеет статус "подключено". Нарыл еще MIB_IF_OPER_STATUS_CONNECTED, но с ним ничего не получается (просто ничего не происходит, даже ошибок) и информации по нему найти я не смог.
Очень прошу помощи, может есть какие-нибудь еще варианты как можно из программы включить/выключить сетевое подключение?
Заранее спасибо.


 
ZENsan ©   (2008-04-29 10:29) [1]

http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q311272


 
ZENsan ©   (2008-04-29 10:49) [2]


procedure TForm37.Button1Click(Sender: TObject);
var
 Fol, Net: Folder;
 Cpl, Con: FolderItem;
 i, j, v: Integer;
begin
 try
   Fol := Shell.NameSpace(ssfCONTROLS);
   for i := 0 to Fol.Items.Count - 1 do
     begin
       Cpl := Fol.Items.Item(i);
       if Cpl.Name = "Network Connections" then
         begin
           Memo1.Lines.Add(Cpl.Name);
           for v := 0 to Cpl.Verbs.Count - 1 do
             Memo1.Lines.Add(Cpl.Verbs.Item(v).Name);
           Net := Cpl.GetFolder as Folder;
           Memo1.Lines.Add("Connections:");
           for v := 0 to Net.Items.Count - 1 do
             begin
               Memo1.Lines.Add(Net.Items.Item(v).Name);
               if Net.Items.Item(v).Name = "Internet" then
                 begin
                   Con := Net.Items.Item(v);
                   for j := 0 to Con.Verbs.Count - 1 do
                     begin
                       Memo1.Lines.Add(Con.Verbs.Item(j).Name);
                       if Con.Verbs.Item(j).Name = "Disa&ble" then
                         Con.Verbs.Item(j).DoIt;
                     end;
                 end;
             end;
           Memo1.Lines.Add("======================");
         end;
     end;
 finally
   Fol := nil;
   Cpl := nil;
   Net := nil;
   Con := nil;
 end;
end;


Не вижу проблемы... всё работает как часы


 
ZENsan ©   (2008-04-29 11:00) [3]

Меню Enable/Disable - всегда первое.. и проверять его номер думаю даже может не стоит..

А для проверки имени {BA126ADB-2166-11D1-B1D0-00805FC1270E} - у тебя GUID есть..


 
AlexTitov   (2008-04-29 12:16) [4]

Спасибо, сейчас попробую этот вариант.


 
ZENsan ©   (2008-04-29 15:30) [5]

Folder.GetPath даёт этот гуид если что..


 
DVM ©   (2008-04-29 22:39) [6]

не проще вызвать netsh?



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
2-1252323235
Виктор
2009-09-07 15:33
2009.11.01
Вопрос по поводу DBGrid-а


2-1252648119
Гость
2009-09-11 09:48
2009.11.01
Объявление переменной


15-1250971948
KilkennyCat
2009-08-23 00:12
2009.11.01
Провал ЕГЭ


2-1252096753
Shyrick
2009-09-05 00:39
2009.11.01
Межпроцессное взаимодействие IPC


15-1252009806
Юрий
2009-09-04 00:30
2009.11.01
С днем рождения ! 4 сентября 2009 пятница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский