Как подключить/отключить сетевой диск?
Кто-нибудь подскажет как подключить сетевой диск? Если не трудно, то с комментариями, плиз.
пример
net use z: \\srvbdc6\catalog
z: - новое имя
\\srvbdc6\catalog - подключаемый ресурс
Кто-нибудь подскажет как подключить сетевой диск? Если не трудно, то с комментариями, плиз.
Еще актуально?
Речь идет о подключении к сетевому ресурсу из какого-то приложения, написанного на VB (или его разновидностях)?
Если оба ответа - "да", то могу привести примеры кодов на VBA для программного подключения/отключения сетевого ресурса: диска, каталога.
В принципе код предусматривает возможность подключения и к сетевому принтеру, но здесь у меня что-то пока не работает.
Основной инструмент - функции из комплекта Win32API. Годится?
Да, актуально! Из командной строки типа net use не годится. Пример с WinAPI тоже подойдет (особенно если с комментариями:)). Надо програмно отключить/подключить сетевой диск/ресурс (не принтер). Если есть пример без API - еще лучше!
Код на с (пардон с API)
{
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);
}
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
Да, актуально! Из командной строки типа net use не годится. Пример с WinAPI тоже подойдет (особенно если с комментариями:)). Надо програмно отключить/подключить сетевой диск/ресурс (не принтер). Если есть пример без API - еще лучше!
А через SHELL на VB/VBA не подойдет?
типа
shell "net use z: \\srvbdc6\catalog"
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