Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > вход в сетевую папку


Автор: Igor Graf 28.4.2005, 07:59
Привет программистам!
Этот вопрос я как-то пытался задать, но мне сказали, что это уже было и не ответили. Не знаю , вроде весь форум тогда облазил, но так и не нашел .

Вопрос о том , как можно програмно войти в папку с открытым доступом и известным паролем.
Допустим на серваке есть папка, которую специально для меня выделили, там лежат мои бд и прога моя туда ломится. Так вот запускаю я программу (свою) и появляется окно ввода пароля, чтоб в эту папку войти, вопрос в том как сделать чтобы это окно не появлялось, и пароль автоматом читался. Если кто видел инфу по этому вопросу, то пожалуйста дайте ссылку.
Заранее спасибо.


С уважением Graf

Автор: amt 28.4.2005, 08:09
Проблемой доступа к папке с паролем я много занимался и решил ее следующим образом.
Сразу оговорюсь - для Win98.
Есть досовская команда net use.
В своей проге я запускаю comman.com с параметрами. Сейчас под рукой кода нет, потому могу напутаь\ть, но что-то вроде того:
Shell ("c:\command.com /c net use \\имя_компа\папка пароль")
Если нужно посмотрю у себя и напишу код. А вообще посмотри справку по net use, там еще есть дополнение, чтобы пароль не записывался в файл паролей.
Если еще какие вопросы - пиши.

Автор: Igor Graf 28.4.2005, 08:15
Спасибо amt идея понятна , код тоже не помешал бы smile . Для XP наверное что-то в этом духе можно замутить?. Еще раз спасибо, буду смотреть, эксперементировать.

Да кстати имя компа какого , сервера или локального?

С уважением Graf

Автор: amt 28.4.2005, 08:20
На счет XP.
Моя прога, которую я делал, предназначена для копирования файлов и папок на большое количество машин по локальной сети. В принципе я добился того, что даже не надо иметь общую папку на компах в сети. Прога сама дает доступ целиком к машинам и можно делать все, что хочешь. Но на ОС типа 2k иная политика безопасности и в 2000-ом (сам пробовал) были проблемы. Но зная точно политику безопасности, думаю можно и в XP сделать.
Удачи!


Автор: amt 28.4.2005, 08:31
Имя компа на котором общая папка, в которую хочешь войти.

Автор: Igor Graf 28.4.2005, 08:34
Ясно , если не трудно потом код скинь пожалуйста

Автор: amt 28.4.2005, 08:44
Смогу только либо сегодня вечером, а скорее завтра утром.

Автор: Naghual 28.4.2005, 08:51
amt
Будет очень интересно поглядеть. А то есть у меня необходимость в написании бекапа сетевого.

Автор: amt 28.4.2005, 08:52
А что такое бекап?

Автор: Naghual 28.4.2005, 08:59
Цитата
А что такое бекап?

Резервное архивирование данных.

Автор: efedron 28.4.2005, 10:49
Igor Graf
чтобы окошко с паролем не вылетало попробуй сначала установить сетевое соединение (типа net use, только программно)
Код

Private Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long
Const WN_SUCCESS = 0
Const WN_NET_ERROR = 2
Const WN_BAD_PASSWORD = 6
Function AddConnection(MyShareName As String, MyPWD As String, UseLetter As String) As Integer
AddConnection = WNetAddConnection(MyShareName, MyPWD, UseLetter)
End Function
Private Sub Form_Load()
Dim iRet As Integer
    iRet = AddConnection("\\remotecomp\e$", "пароль", "")
Select Case iRet
    Case WN_SUCCESS
        MsgBox "OK"
    Case WN_NET_ERROR
        MsgBox "ошибка"
    Case WN_BAD_PASSWORD
        MsgBox "Неправильный пароль"
End Select
End Sub


Автор: Naghual 28.4.2005, 11:12
2 efedron
А как потом с этим соединением работать?

Автор: amt 28.4.2005, 19:02
Вот вам то, что обещал.

Код

'На всякий случай
'определяет имя текущего компа
Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
'Где-нибудь
Dim curComp As String, curComp1 As String, k1 as integer
GetComputerName curComp, 255
k1 = 1
15 curComp1 = Mid(curComp, k1, 1)
If curComp1 <> Chr(0) Then
    k1 = k1 + 1
    GoTo 15
    End If
curComp1 = Mid(curComp, 1, k1 - 1)
'------------------------------------------------------
'Код для ожидания окончания выполнения операций приложением
Public Sub ExecCmd(cmdline$)
        Dim proc As PROCESS_INFORMATION
        Dim start As STARTUPINFO

        ' Инициализируем структуру STARTUPINFO:
        start.cb = Len(start)
        start.dwFlags = 1
        start.wShowWindow = 0
        
        ' Запускаем приложение:
        ret& = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _
           NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)

        ' Ждем завершения запущенного приложения:
        ret& = WaitForSingleObject(proc.hProcess, INFINITE)
        ret& = CloseHandle(proc.hProcess)
     End Sub
'Функцией ExecCmd() будет запускаться приложение в невидимом режиме.
'--------------------------------
'Если нужно
'Просмотр имен всех компов, подключенных к ЛС.
ExecCmd ("C:\WINDOWS\command.com /c net view > c:\имя_файла")
'Где:
'ExecCmd - процедура, заставляющая прогу ждать окончания выполнения приложения.
'command.com /c - запуск командного процессора, с последующим завершением (автоматически) после выполнения команды
'net view - просмотр компов в сети
'> c:\имя_файла - перенаправление результата просмотра в текстовый файл.

''-----------------------------------------------------------
'Для получения доступа
'полный доступ к компу
str1 = "C:\WINDOWS\command.com /c net use \\имя_компа\ADMIN$ пароль /savepw:no"
'доступ к общей папке
str1 = "C:\WINDOWS\command.com /c net use \\имя_компа\имя_общей_папки пароль /savepw:no"
ExecCmd (str1)

'Если не поставить ключ /savepw:no, то пароль будет записан в файл паролей.
'Ну а дальше с удаленным компом или папкой можно работать как с обычными папками своего компа.
'------------------------------------------------------------
'после получения доступа к папке или компу с твоего компа любой может обратиться к этим ресурсам.
'Чтобы этого не было где-нибудь (например, после закрытия формы или все твоей проги) поставь:

'отключение всех ресурсов (имеется ввиду общие папки, к которым был получен доступ. Одна команда работает для всех компов к папкам которых, был получен доступ.
ExecCmd ("C:\WINDOWS\command.com /c net use * /delete /yes") 
'Для отключения полного доступа с каждым компом придется работать отдельно
ExecCmd ("C:\WINDOWS\command.com /c net use \\имя_компа\ADMIN$ /delete /yes")
Я сначала дал код для Shell (просто под рукой проги не было), но это вообще-то не подойдет.
Если запускать command.com, то открывается ДОСовское окно и если возникают ошибки то окно просто закрывается (ключ /с) и могут быть проблемы. Кроме того, сеть еще может быть не прохрюкалась и получается тоже самое. Поэтому лучше юзать ExecCmd (). Кстати, мне это кто-то на форуме подкинул (уже не помню кто) – огромное спасибо!

!!!Очень внимательно с пробелами в командах!!!
Еще раз напомню что это все классно работает под Win98. С Win2k нужно поработать.
Надеюсь хоть чем-то помог. Будут вопросы – пишите.
Удачи!

Автор: Igor Graf 30.4.2005, 08:24
Спасибо всем за участие! Будем разбираться.
Да Amt ты не мог-бы пояснить kernel32 это библиотека ? и Для чего она служит?

Автор: Exception 1.5.2005, 15:06
Цитата(Igor @ 30.4.2005, 09:24)
kernel32 это библиотека ? и Для чего она служит?

Она служит ядром (!) Win 9x и одной из важнейшх библиотек WinNT. Т.е. 200 и XP. В ней находятся важнейшие ф-ции система, такие как: управление процессами, выключение компа и т.п. Правда, в NT многие ф-ции kernel32 являются на самом деле обращениями к ntdll.dll и ntoskrnl.dll . Это - ядро NT.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)