Форум: "Сети";
Текущий архив: 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