Консультация № 182785
09.04.2011, 15:33
51.70 руб.
0 26 1
Уважаемые эксперты! Нуждаюсь в вашей помощи, при написании кода программы...

Нужно написать программу, которая разрывает сетевое подключение. Используйте функцию WNetCancelConnection.

теория в приложении
||
||
||
[$8744$]

Приложение:
Функции WNet позволяют просматривать сетевые ресурсы способом, не зависящим от сети, а также подключатся к сетевым ресурсам и отключатся от них по своему усмотрению. Когда вы подключаетесь к сетевому ресурсу, этот ресурс интерпретируется так, словно он является локальным для вашей системы. Допустим, у вас имеется сетевой сервер \\OtherSystem, на котором установлен общий диск OtherDriveC; корневой кактолг диска содержит файл FileInRoot.doc. Вы можете подключить \\OtherSystem\OtherDriveC как диск D: и в дальнейшем ссылаться на указанный файл, используя полное имя в формате UNC \\OtherSystem\OtherDriveC\FileInRoot.doc или D:\FileInRoot.doc. При отключении от сетевого ресурса вы по-прежнему сможете обращаться к файлу по UNC, но сослаться на него как на часть логического диска D: будет уже невозможно – подключение его как локального ресурса будет прекращено.
Рассмотрим следующей функции, которые понадобятся при выполнении лабораторной работы.

WNetAddConnection

Функция позволяет приложению подключить сетевой ресурс как локальное устройство. Успешное подключение постоянно, это означает, что Windows автоматически восстанавливает подключение при перезагрузке.

Формат:
function WNetAddConnection(
lpRemoteName, //Сетевое имя ресурса
lpPassword, //Необязательный параметр. Пароль
lpLocalName: PChar //Локальное имя ресурса (пр. Z:)
): DWORD;

Значения: возвращает ноль в случае успеха.

WNetCancelConnection

Функция разрывает сетевое подключение.

Формат:

function WNetCancelConnection(
lpName: PChar; // Удаленное или локальное имя ресурса
fForce: BOOL //Определяет, должно ли разъединение произойти, даже если имеются открытые файлы или задания на подключении.
): DWORD;

Значения: возвращает ноль в случае успеха.

Обсуждение

давно
Мастер-Эксперт
425
4118
10.04.2011, 05:47
общий
А в чём именно у Вас проблема? Функция черезвычайно проста и Ваши затруднения несколько непонятны. Вы не могли бы написать более подробно, в каком месте реализации у Вас возникают затруднения?
И вопрос вдогонку: у Вас в институте лабораторные опыты до сих пор проводят с использованием Windows 3.11? Дело в том, что те функции, описание которых Вы привели в Приложении, предназначались для 16-ти разрядных Windows...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
10.04.2011, 11:52
общий
я не могу понять...как она вообще может работать и как будет выглядеть исходный продукт)

у нас такой преподаватель

[i]предназначались для 16-ти разрядных Windows...[/i]
для 32-х не пойдут ?
давно
Мастер-Эксперт
425
4118
10.04.2011, 12:32
общий
Цитата: 235545
для 32-х не пойдут ?

Честно говоря, не знаю. Дело в том, что в функции подключения отсутствует один важный параметр - имя пользователя. И если в Windows 95\98\МЕ расшареные ресурсы делались по образцу и подобию Win 3.11, т.е. там можно поставить пароль, но от пользователя этот ресурс ни капли не зависел, то в Windows линейки NT\2000\XP\и так далее, ресурс ориентирован в первую очередь на определённого пользователя, а пароль - это просто подтверждение, что пользователь именно тот за кого себя выдаёт.
Я завтра на работе попробую, как эти функции ведут себя в домене Windows, т.е. в нормальной сетевой среде (дома не на чем ), тогда скажу Вам, будет работать или нет.

Если говорить об общем принципе работы, то, к примеру, на каком-то компьютере есть какой-то каталог, который виден в сети. Его, этот каталог, нужно подключить к другому компьютеру в виде отдельного логического диска. Получается что-то вроде этого:
Код:
If WNetAddConnection('\\ДругойКомпьютер\СетевойРесурс', '?Пароль_доступа?', 'Z:')=NO_ERROR Then
ShowMessage('Сетевой ресурс подключён как диск Z')
Else
ShowMessage(SysErrorMessage(GetLastError));

Теперь, когда Вы знаете имя логического диска, куда подключён сетевой ресурс, его можно отключить:
Код:
WNetCancelConnection('Z:', True);

Единственный вопрос в таком применении - это параметр Password в первой функции. В домене, если у сетевого ресурса есть разрешение для определённого пользователя, то для подключения к нему с любого компьютера пароль совершенно не требуется. Так что этот момент требует проверки.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
10.04.2011, 12:35
общий
мм вон оно как...
буду ждать вашего отчета
давно
Мастер-Эксперт
425
4118
11.04.2011, 14:41
общий
Ну что ж, как ни странно, но функция подключения ресурса работает в домене, причём, как я и предполагал, на второй параметр (т.е. пароль) ей в высшей степени наплевать. Вместо пароля можно подставлять любую билиберду или вообще поставить NIL.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
11.04.2011, 15:02
общий
это ответ
Здравствуйте, Андреев Дмитрий Фёдорович!

Если говорить об общем принципе работы, то, к примеру, на каком-то компьютере есть какой-то каталог, который виден в сети. Его, этот каталог, нужно подключить к другому компьютеру в виде отдельного логического диска. Получается что-то вроде этого:
Код:
If WNetAddConnection('\\ДругойКомпьютер\СетевойРесурс', '?Пароль_доступа?', 'Z:')=NO_ERROR Then
ShowMessage('Сетевой ресурс подключён как диск Z')
Else
ShowMessage(SysErrorMessage(GetLastError));

-----
Небольшие комментарии к подключению сетевого ресурса.
Если Вы работаете в домене Windows, то вместо второго параметра этой функции можно подставлять любую строку или вообще NIL. Каждый пользователь в домене получает при регистрации на контроллере домена свой идентификатор безопасности, с которым потом можно обратится к любому ресурсу домена, к которому есть доступ для данного пользователя.
Параметр "Пароль_доступа" является пережитком предыдущих одноранговых сетей Windows, когда в них не было единого сервера регистрации пользователей, а ресурсы выделялись для всех подряд, но, с целью повышения безопасности их использования, на эти ресурсы можно было наложить дополнительный пароль. Т.е. тот, кто знает пароль, может подключиться к ресурсу. Так было в сетях Windows 3.х, Windows 95\98\ME.
----
Теперь, когда Вы знаете имя логического диска, куда подключён сетевой ресурс, его можно отключить:
Код:
WNetCancelConnection('Z:', True);


Тестовую программу составить не сложно. Берёте форму, кидаете на неё две кнопки. Одна кнопка будет заведовать подключением к сетевому ресурсу, а вторая - отключением. В событие OnClick кнопки подключения помещаете код из первого окошка, только в функции подключения надо указать реальное название удалённого компьютера и реальное название его сетевого ресурса. После нажатия на кнопку подключения произойдёт подключения ресурса в качестве локального диска "Z:" (или выскочит окошко с сообщением, почему подключение не удалось), после чего к нему можно обращаться так же, как к локальному диску.
В событие OnClick второй кнопки помещаете код из второго окошка. Второй параметр функции отключения означает, что сетевой ресурс будет отключён от буквы локального диска в принудительном порядке, даже если с него был открыт (и не закрыт) какой-нибудь файл. Если же поставить вторым параметром False, то диск не удастся отключить до тех пор, пока все файлы с этого ресурса не будут закрыты. Т.е. безопасное отключение диска можно написать таким образом:
Код:
If WNetCancelConnection('Z:', False)<>NO_ERROR Then
ShowMessage(SysErrorMessage(GetLastError));

Если отключения не произойдёт, то будет выведено окно с сообщением, по какой причине не произошло отключение.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
11.04.2011, 16:30
общий
а можно все таки ввиде исходника ?
давно
Мастер-Эксперт
425
4118
11.04.2011, 17:02
общий
А это весь исходник. Ничего больше своими руками писать не надо, Delphi весь остальной код создаёт автоматически.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
11.04.2011, 17:04
общий
ну щас попробую...
Неизвестный
11.04.2011, 18:21
общий
как указать сетевой путь ?
давно
Мастер-Эксперт
425
4118
12.04.2011, 03:21
общий
Цитата: 235545
как указать сетевой путь ?

1. Его можно написать прямо в первом параметре функции, если выбора, в принципе, нет.
2. Можно бросить на форму компонент Edit и сетевой путь указывать в нём. Тогда сетевой путь можно подставлять в функцию таким образом:
Код:
WNetAddConnection(PChar(Edit1.Text), NIL, 'Z:')
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
12.04.2011, 06:18
общий
а Z: это локальный диска на другом компьютере ?
давно
Мастер-Эксперт
425
4118
12.04.2011, 06:47
общий
Z: - это псевдолокальный диск на Вашем компьютере. Через него Вы будете обращаться к сетевому ресурсу.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
12.04.2011, 17:04
общий
реальное название моего комп-ра Admin, название сетевго ресурса тоже вроде Admin...при выполнении кода программы говорит что "вход в систему не произведен: имя пользователя или пароль не опознаны"
???
давно
Мастер-Эксперт
425
4118
12.04.2011, 17:57
общий
Тогда вопрос такой: у Вас познания в компьютерах вообще на каком уровне находятся? Мне нужно знать, с чего начинать объяснения.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
12.04.2011, 17:59
общий
что касается сетевого уровня то не очень)
просто вы тут говорить об указании сетевого пути, я не могу понять где его взять для указания ?
и где мне взять этот Z:, самому его создать или как...?
давно
Мастер-Эксперт
425
4118
12.04.2011, 18:23
общий
На сегодняшний день у Windows есть два уровня сетей:
1. Доменный сеть. Это когда список пользователей сети хранится на определённом компьютере и доступом к ресурсам любого компьютера занимается именно этот, условно говоря, один компьютер. Такой компьютер называется контроллером домена. Для подключения к сетевым ресурсам компьютеров этого вида сети функции, которые представлены в приложении Вашего вопроса подходят просто в силу того, что имя пользователя не имеет значения и при этом пароль тоже не играет никакого значения, т.к. проверка действительности пользователя проходит совершенно на другом уровне. Ресурсы предоставляются для пользователя, который зарегистрирован на контроллере домена и поэтому они могут находится где угодно, но при условии, что контроллер может проверить подлинность пользователя.
2. Одноранговая сеть. В этом случае список пользователей хранится у каждого компьютера свой. В такой сети сетевые ресурсы предоставляются пользователю, который известен компьютеру, который эти самые ресурсы предоставляет. При этом возникает ситуация, когда для предоставления ресурса компьютер, который этот ресурс предоставляет, не может проверить подлинность пользователя никак иначе, как только сверив имя пользователя и пароль со своим собственным списком пользователей. Таким образом возникает логическая предпосылка, что при подключении к ресурсу подключающаяся сторона должна посылать для подключения как пароль, так и реальное имя пользователя, которое есть на том компьютере, который предоставляет ресурс. Предусматривает Ваша функция такие возможности? Увы, нет, т.к. в то время, когда эта функция разрабатывалась, подобных уровней сетей и подобных способов предоставления ресурсов в сети ещё не было.
Что у нас получается? Развёрнутого домена у Вас нет. Это следует из того факта, что в сообщении об ошибке говорится и об имени пользователя и о пароле. В противном случае сообщение было бы другим, например "Отказано в доступе". В Вашей ситуации функция WNetAddConnection() неприемлема, т.к. не содержит в себе нужных сведений для подключения к ресурсу.
Я Вам могу предложить альтернативу. Вопрос только будет в том, поймёт ли Вас препод?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
12.04.2011, 18:30
общий
попробуйте конечно...главное что бы Вас понял я...а дальше уже будет легче))
давно
Мастер-Эксперт
425
4118
12.04.2011, 18:31
общий
Цитата: 235545
просто вы тут говорить об указании сетевого пути, я не могу понять где его взять для указания

Этот путь берётся из значка "Сетевое окружение" или как там он у Вас называется... В общем в том окошке, где Вы просматриваете список других компьютеров. Если в сети есть компьютер, то щёлкаете по нему два раза и открывается списорк ресурсов, которые он предоставляет. Например, Вы в сети обнаружили компьютер Admin. Щёлкнули по нему два раза и обнаружили, что у него есть, к примеру, два ресурса, которые он предоставляет по сети: C$ и D$. Таким образом путь к ресурсу будет либо \\Admin\C$, либо \\Admin\D$.
Цитата: 235545
где мне взять этот Z:, самому его создать или как...?

Самому не надо создавать. Главное условие, чтобы у Вас под этим именем не было локального диска. Т.е. Вы открываете значёк "Мой компьютер" и внимательно смотрите, нет ли у Вас там такого диска с такой же буквой. Если нет, то к этой букве ("Z:") можно смело подключать сетевой ресурс. После успешного подключения, когда Вы откроете "Мой компьютер", то увидите, что у Вас там появился новый логический диск "Z". Открыв его Вы увидите, что на нём находятся те файлы, как и на том ресурсе, который Вы к этой букве подключали.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
12.04.2011, 18:37
общий
Цитата: Вадим Исаев ака sir Henry
Этот путь берётся из значка "Сетевое окружение" или как там он у Вас называется... В общем в том окошке, где Вы просматриваете список других компьютеров. Если в сети есть компьютер, то щёлкаете по нему два раза и открывается списорк ресурсов, которые он предоставляет. Например, Вы в сети обнаружили компьютер Admin. Щёлкнули по нему два раза и обнаружили, что у него есть, к примеру, два ресурса, которые он предоставляет по сети: C$ и D$. Таким образом путь к ресурсу будет либо \\Admin\C$, либо \\Admin\D$.


вот кстати говоря так и делал, только не знал что это так называется
у меня C и D не показало, там только принтеры и факсы, и назначенные задания

открыл общий доступ на С, вставил на событие в кнопке...теперь выдает ошибку что сетевой путь не найден(
давно
Мастер-Эксперт
425
4118
12.04.2011, 18:52
общий
Цитата: 235545
попробуйте конечно...главное что бы Вас понял я...а дальше уже будет легче

Тогда вот Вам альтернатива:
Код:
WNetAddConnection2(
lpNetResource: TNetResource,
lpPassword: PChar,
lpUsername: PChar,
dwFlags: DWord
): DWORD;

В этой функции:
- lpNetResource - это составная структура, в Delphi она называется "запись". Заполняется запись таким образом:
Код:
lpNetResource.dwType := RESOURCETYPE_ANY; //Тип ресурса. В данном случае это может быть любой тип - хоть расшареный каталог, хоть расшареный принтер.
lpNetResource.lpLocalName :='Z:'; //Имя псевдолокального диска, через который будет происходить общение с файлами подключённого ресурса.
lpNetResource.lpRemoteName :="\\Admin\C"; //Полное имя сетевого ресурса, куда подключаемся.
lpNetResource.lpProvider := NIL; //В данном случае этот параметр значения не имеет

- lpPassword - сюда пишется реальный пароль, который Вы вводите при загрузке операционной системы того компьютера, к которому подключаетесь,
- lpUsername - вот это основное отличие от старой функции. Сюда Вы заносите имя реального пользователя того компьютера, чей сетевой ресурс Вы подключаете,
- dwFlags - дополнительные параметры подключения. В примере от Microsoft стоит всего один флаг - CONNECT_UPDATE_PROFILE, его вполне достаточно.

Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
12.04.2011, 19:02
общий
мде, в альтернативе вообще запутался((
на форму кидайю кнопку в которой пишу код:

WNetAddConnection2(
lpNetResource: lpNetResource.dwType := RESOURCETYPE_ANY; lpNetResource.lpLocalName :='Z:'; lpNetResource.lpRemoteName :="\\Admin\C"; lpNetResource.lpProvider := NIL;
lpPassword: PChar, ---- пароля при загрузке ОС нету !!!
lpUsername: Admin,
dwFlags: CONNECT_UPDATE_PROFILE
): DWORD;

так ???
давно
Мастер-Эксперт
425
4118
12.04.2011, 19:08
общий
Цитата: 235545
так ???

Нет, не так. Нужно вот так:
Код:
Var
lpNetResource: TNetResource;

Begin
...
lpNetResource.dwType := RESOURCETYPE_ANY;
lpNetResource.lpLocalName :='Z:';
lpNetResource.lpRemoteName :='\\Admin\C';
lpNetResource.lpProvider := NIL;

If WNetAddConnection2(lpNetResource, '', 'Admin', CONNECT_UPDATE_PROFILE) <> NO_ERROR Then
ShowMessage(SysErrorMessage(GetLastError));
End;
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
12.04.2011, 19:16
общий
вот, теперь создается и отключается!
спасибо вам огромное что уделили мне время и помогли разобраться в программе!
который раз меня уже выручаете!

а если есть пароль то его вписываем в пустые ковычки ' '...да?
давно
Мастер-Эксперт
425
4118
13.04.2011, 03:04
общий
Цитата: 235545
а если есть пароль то его вписываем в пустые ковычки ' '...да?

Совершенно верно.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
13.04.2011, 09:32
общий
Цитата: Вадим Исаев ака sir Henry
Совершенно верно.


еще раз спасибо!
Форма ответа