Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как подключить/отключить сетевой диск?

2.1K
09 декабря 2004 года
pnvnik
40 / / 26.04.2004
Кто-нибудь подскажет как подключить сетевой диск? Если не трудно, то с комментариями, плиз.
459
10 декабря 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by pnvnik
Кто-нибудь подскажет как подключить сетевой диск? Если не трудно, то с комментариями, плиз.


пример
net use z: \\srvbdc6\catalog

z: - новое имя
\\srvbdc6\catalog - подключаемый ресурс

405
22 декабря 2004 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by pnvnik
Кто-нибудь подскажет как подключить сетевой диск? Если не трудно, то с комментариями, плиз.



Еще актуально?
Речь идет о подключении к сетевому ресурсу из какого-то приложения, написанного на VB (или его разновидностях)?
Если оба ответа - "да", то могу привести примеры кодов на VBA для программного подключения/отключения сетевого ресурса: диска, каталога.
В принципе код предусматривает возможность подключения и к сетевому принтеру, но здесь у меня что-то пока не работает.
Основной инструмент - функции из комплекта Win32API. Годится?

2.1K
22 декабря 2004 года
pnvnik
40 / / 26.04.2004
Да, актуально! Из командной строки типа net use не годится. Пример с WinAPI тоже подойдет (особенно если с комментариями:)). Надо програмно отключить/подключить сетевой диск/ресурс (не принтер). Если есть пример без API - еще лучше!
259
22 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by pnvnik
Да, актуально! Из командной строки типа net use не годится. Пример с WinAPI тоже подойдет (особенно если с комментариями:)). Надо програмно отключить/подключить сетевой диск/ресурс (не принтер). Если есть пример без API - еще лучше!



Код на с (пардон с API)

Код:
DWORD ConnectRemoteDrive(LPSTR ShareName,LPSTR LocalDrive)
  {
     NETRESOURCE nr;
     ZeroMemory(&nr,sizeof(nr));

     nr.dwScope=RESOURCE_GLOBALNET;
     nr.dwType=RESOURCETYPE_DISK;//RESOURCETYPE_ANY;
     nr.dwDisplayType=RESOURCEDISPLAYTYPE_GENERIC;
     nr.dwUsage=RESOURCEUSAGE_CONNECTABLE;
     nr.lpLocalName=LocalDrive;
     nr.lpRemoteName=ShareName;
     nr.lpComment="";
     nr.lpProvider=NULL;

     return WNetAddConnection2(&nr, (LPSTR) NULL, (LPSTR) NULL, CONNECT_UPDATE_PROFILE);
 }
258
22 декабря 2004 года
SergeySV
1.5K / / 19.03.2003
Код:
Private Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long
Private Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" (ByVal lpszName As String, ByVal bForce As Long) As Long


Function AddConnection(shareName As String, pwd As String, localLetter As String) As Boolean
    'Если успешно то NO_ERROR. Если функция терпит неудачу, то возвращается одно из следующих значений:
    'ERROR_ACCESS_DENIED - Нет доступа к сетевому ресурсу.
    'ERROR_ALREADY_ASSIGNED - Устройство указанное в параметре lpLocalName уже переопределено.
    'ERROR_BAD_DEV_TYPE - Тип устройства и тип ресурса не сочетается.
    'ERROR_BAD_DEVICE - Значение определенное в параметре lpLocalName неверно.
    'ERROR_BAD_NET_NAME - Значение определенное в параметре lpRemoteName неверно.
    '
    'ERROR_BAD_PROFILE - Профиль пользователя неправильного формата.
    'ERROR_CANNOT_OPEN_PROFILE - Система не может открыть профиль пользователя.
    'ERROR_DEVICE_ALREADY_REMEMBERED - Прявязка для устройства указнного в параметре lpLocalName - уже в профиле пользователя.
    'ERROR_EXTENDED_ERROR - Произошла сетевая спецефическая ошибка. Для того чтобы получить информацию об ошибке, вызовите функцию WNetGetLastError.
    'ERROR_INVALID_PASSWORD - Пароль недействителен.
    '
    'ERROR_NO_NET_OR_BAD_PATH - Операция не выполнена потому что сетевой компонент не запущен или имя сетевого ресурса не может быть использовано.
    'ERROR_NO_NETWORK - Сеть отсутствует.
   
    'Параметры:
    '[lpRemoteName] - cтрока, определяющая удаленный сетевой ресурс для соединения.
    '[lpPassword]   - cтрока, которая определяет пароль, для аутентификации. Если этот параметр nil,
    '                 то используется пароль по умолчанию, если строка пустая,
    '                 то пароль не используется.
    '                 Win 95/98/Me: Этот параметр должен быть nil или пустой строкой.
    '[lpLocalName]  - cтрока которая определяет имя локального устройства, которое нужно переназначить.
    '                 Например "F:" ли "LPT1". Если строка равна nil, то
    '                 локальный ресурс не переназначается.
 
  On Local Error GoTo AddConnection_Err
   
    AddConnection = WNetAddConnection(shareName, pwd, localLetter)
    AddConnection = True

AddConnection_End:
    Exit Function

AddConnection_Err:
    Select Case Err.Number
      Case ERROR_ACCESS_DENIED
         '.....  
      Case Else
         '.....
    End Select
    AddConnection = False
    Resume AddConnection_End
End Function



Function CancelConnection(localLetter As String, force As Integer) As Boolean
  On Local Error GoTo CancelConnection_Err
   
    CancelConnection = WNetCancelConnection(localLetter, force)
    CancelConnection = True
   
CancelConnection_End:
    Exit Function

CancelConnection_Err:
    CancelConnection = False
    MsgBox Error$
    Resume CancelConnection_End
End Function
459
23 декабря 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by pnvnik
Да, актуально! Из командной строки типа net use не годится. Пример с WinAPI тоже подойдет (особенно если с комментариями:)). Надо програмно отключить/подключить сетевой диск/ресурс (не принтер). Если есть пример без API - еще лучше!


А через SHELL на VB/VBA не подойдет?
типа
shell "net use z: \\srvbdc6\catalog"

405
23 декабря 2004 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by SergeySV
Код:
Private Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long
Private Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" (ByVal lpszName As String, ByVal bForce As Long) As Long


Function AddConnection(shareName As String, pwd As String, localLetter As String) As Boolean
    'Если успешно то NO_ERROR. Если функция терпит неудачу, то возвращается одно из следующих значений:
    'ERROR_ACCESS_DENIED - Нет доступа к сетевому ресурсу.
    'ERROR_ALREADY_ASSIGNED - Устройство указанное в параметре lpLocalName уже переопределено.
    'ERROR_BAD_DEV_TYPE - Тип устройства и тип ресурса не сочетается.
    'ERROR_BAD_DEVICE - Значение определенное в параметре lpLocalName неверно.
    'ERROR_BAD_NET_NAME - Значение определенное в параметре lpRemoteName неверно.
    '
    'ERROR_BAD_PROFILE - Профиль пользователя неправильного формата.
    'ERROR_CANNOT_OPEN_PROFILE - Система не может открыть профиль пользователя.
    'ERROR_DEVICE_ALREADY_REMEMBERED - Прявязка для устройства указнного в параметре lpLocalName - уже в профиле пользователя.
    'ERROR_EXTENDED_ERROR - Произошла сетевая спецефическая ошибка. Для того чтобы получить информацию об ошибке, вызовите функцию WNetGetLastError.
    'ERROR_INVALID_PASSWORD - Пароль недействителен.
    '
    'ERROR_NO_NET_OR_BAD_PATH - Операция не выполнена потому что сетевой компонент не запущен или имя сетевого ресурса не может быть использовано.
    'ERROR_NO_NETWORK - Сеть отсутствует.
   
    'Параметры:
    '[lpRemoteName] - cтрока, определяющая удаленный сетевой ресурс для соединения.
    '[lpPassword]   - cтрока, которая определяет пароль, для аутентификации. Если этот параметр nil,
    '                 то используется пароль по умолчанию, если строка пустая,
    '                 то пароль не используется.
    '                 Win 95/98/Me: Этот параметр должен быть nil или пустой строкой.
    '[lpLocalName]  - cтрока которая определяет имя локального устройства, которое нужно переназначить.
    '                 Например "F:" ли "LPT1". Если строка равна nil, то
    '                 локальный ресурс не переназначается.
 
  On Local Error GoTo AddConnection_Err
   
    AddConnection = WNetAddConnection(shareName, pwd, localLetter)
    AddConnection = True

AddConnection_End:
    Exit Function

AddConnection_Err:
    Select Case Err.Number
      Case ERROR_ACCESS_DENIED
         '.....  
      Case Else
         '.....
    End Select
    AddConnection = False
    Resume AddConnection_End
End Function



Function CancelConnection(localLetter As String, force As Integer) As Boolean
  On Local Error GoTo CancelConnection_Err
   
    CancelConnection = WNetCancelConnection(localLetter, force)
    CancelConnection = True
   
CancelConnection_End:
    Exit Function

CancelConnection_Err:
    CancelConnection = False
    MsgBox Error$
    Resume CancelConnection_End
End Function




К примеру, приведенному SergeySV, могу предложить некоторые замечания.

1. Функция WNetAddConnection ориентирована на 16-разрядный API. Для 32-разрядного лучше использовать WNetAddConnection2
(описание см. ниже). Для ее нормальной работы нужно описать структуру NETRESOURCE (см. ниже).

2. В доменных сетях на базе Windows NT/2000/XP для отключения сетевого ресурса лучше использовать функцию WNetCancelConnection2.
У нее (в отличие от WNetCancelConnection) есть флаг, позволяющий указать, надо ли обновить профиль пользователя после отключения ресурса.
Если не обновлять профиль, то при следующей загрузке компьютера отключенный ресурс опять будет доступен.

====

Итак, сам код.

1. Объявляем структуру данных

Private Type NetResource
dwScope As Long
dwType As Long 'Тип ресурса: дисковый или принтер
dwDisplayType As Long
dwUsage As Long
lpLocalName As String 'Локальное имя ресурса, например, "x:"
lpRemoteName As String 'Сетевое имя ресурса, например, "\\server\d$"
lpComment As String
lpProvider As String 'Системный провайдер, обеспечивающий собственно подключение, например, "LDAP:"
End Type

Примечание.
Системный провайдер - компонент ОС Windows. Он отвечает за работу в соответствующем пространстве имен сетевых объектов.
Если это значение не задавать, то будет выбран провайдер, действующий по умолчанию (что и рекомендую).

2. Объявляем функции из комплекта Win32 API.

Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NetResource, ByVal strPassword As String, ByVal strUserName As String, ByVal lngFlags As Long) As Long
Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long

3. Описываем пользовательские функции подключения и отключения ресурса.

Function AddConnection(strNetPath As String, strLocalName As String, strUserName As String, strPwd As String, Optional fPersistent As Boolean = True, Optional fDisk As Boolean = True) As Long
'Переменная fPersistent - флаг режима обновления профиля пользователя: обновлять или нет,
'по умолчанию - обновлять (значение TRUE)
'Переменная fDisk - флаг типа сетевого ресурса (диск или принтер), по умолчанию - диск (значение TRUE)

Dim usrNetResource As NetResource
Dim lngFlags As Long

With usrNetResource
.dwType = IIf(fDisk, dhcResourceTypeDisk, dhcResourceTypePrint) 'Определяем тип ресурса
'dhcResourceTypeDisk и dhcResourceTypePrint - стандартные константы функции WNetCancelConnection2
.lpLocalName = strLocalName
.lpRemoteName = strNetPath
.lpProvider = vbNullString
End With
'Задаем режим обновления профиля
lngFlags = IIf(fPersistent, dhcConnectUpdateProfile, dhcConnectDontUpdateProfile)
'Подключаемся к указанному ресурсу
AddConnection = WNetAddConnection2(usrNetResource, strPwd, strUserName, lngFlags)

End Function


Function CancelConnection(strLocalName As String, Optional forceDisconnect As Boolean = False, Optional updateUserProfile As Boolean = True) As Long
'Переменная forceDisconnect - флаг режима отключения ресурса: безусловный или нет, по умолчанию - не безусловный (FALSE)
'Безусловный режим - ресурс будет отключен, даже если есть открытые с отключаемого ресурса файлы
'Не безусловный режим - ресурс не будет отключен, если есть открытые с отключаемого ресурса файлы

Dim lngFlags As Long

'Задаем режим обновления профиля (обновлять или нет)
lngFlags = IIf(updateUserProfile, dhcConnectUpdateProfile, dhcConnectDontUpdateProfile)
'Отключаемся от ресурса
CancelConnection = WNetCancelConnection2(strLocalName, lngFlags, Abs(forceDisconnect))

End Function

4. Проверяем работу функций подключения/отключения

Sub TestNetConnect()
Dim cntResult As Long
cntResult = AddConnection("\\server\c$", "Q:", "Администратор", "")
End Sub


Sub TestNetDisconnect()
Dim cntResult As Long
cntResult = CancelConnection("Q:")
End Sub

---

Анализ ошибок хорошо описан в примере, приведенном SergeySV

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог