Доступ к файлу/папке под сетевым пользователем
, Как подключиться к сетевой папке, зная логин и пароль пользователя?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.123] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы| Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Доступ к файлу/папке под сетевым пользователем
, Как подключиться к сетевой папке, зная логин и пароль пользователя?
|
Сообщ.
#1
,
|
|
|
|
Здравствуйте, уважаемые форумчане!
Возник такой вопрос. Есть программа, которая работает с файлом, который находится в определенной папке. Папка находится в сети на другом компьютере. Пользователь, который запускает программу, не имеет доступа к папке. Но мы знаем логин и пароль пользователя сети, который имеет доступ к папке. Как программно подключиться к папке под нужным сетевым пользователем. Это будет сделано для того, чтобы пользователь ничего не смог ручками менять в сетевой папке. Вся обработка файлов ведется только программой. Если это возможно подскажите, в какую сторону копать или ссылки на мануалы. С сетью в делфи не работал, хочется чего-то доступного и понятного. Желательно в стандартном наборе. Заранее большое спасибо. |
|
Сообщ.
#2
,
|
|
|
|
Цитата mrpit @ Есть программа, которая работает с файлом, который находится в определенной папке. Папка находится в сети на другом компьютере. Цитата mrpit @ Т.е. нужно из под одного пользователя запустить эту программу, но с правами другого? Или создать другую программу, которая будет что то делать с файлом в сети? Как программно подключиться к папке под нужным сетевым пользователем. |
|
Сообщ.
#3
,
|
|
|
|
Опишу подробней, видимо не очень понятно написал.
Есть пользователь, который будет запускать программу. Программа обрабатывает файл пользователя и кладет его в определенную папку в сети (назовем эту папку "защищенной"). В "Защищенную" папку сетевой пользователь, запустивший программу, попасть не может, но нужно сделать так, чтобы программа подключилась под другим сетевым пользователем (в программе будут зашиты логин и пароль) и поместила обработанный файл в "защищенную" папку. |
|
Сообщ.
#4
,
|
|
|
|
Цитата mrpit @ Программа обрабатывает файл пользователя и кладет его в определенную папку в сети (назовем эту папку "защищенной") Программа обработает файл пользователя, затем запускает дополнительный (консольный, как вариант) процесс с правами другого пользователя, передает ему параметры (как вариант, в виде пути к промежуточному, уже обработанному файлу на локальном компе). Данный процесс тупо копирует файл на сетевой ресурс (он запущен с нужными правами доступа посредством CreateProcessWithLogonW) и заканчивает работу. Программа, дождавшись окончания этого процесса, удаляет промежуточный файл с локального диска и завершает работу. Так подойдет? |
|
Сообщ.
#5
,
|
|
|
|
Да! Возможен и такой вариант, в принципе без разницы будет зашито все в одной программе или будет еще дополнительный процесс (как я понимаю это в простейшем варианте какой-нибудь bat-файл). Спасибо большое за подсказку.
Ещё бы примерами кода разбавить ответ, если несложно.=) |
|
Сообщ.
#6
,
|
|
|
|
Цитата mrpit @ Ещё бы примерами кода разбавить ответ, если несложно.=) Так я же тебе АПИ функцию запуска процесса дал. Формируй необходимые для запуска процесса структуры (типа STARTUPINFO) и все. А сам процесс будет запускаться из файла (да хоть тот же батник), который предварительно можно откомпилировать (если не батник) и засунуть в ресурсы программы, которая будет запускать его, предварительно достав из ресурса и сохранив на диск, а после отработки и завершения - удалять ЕХЕ файл с диска (как вариант). |
|
Сообщ.
#7
,
|
|
|
|
Подумал сейчас, а зачем я буду создавать какую-то отдельную программу с удалением файла. Можно же просто сделать оболочку для запуска моей уже написанной программы. Просто она будет запускаться из под нужного пользователя.
|
|
Сообщ.
#8
,
|
|
|
|
Цитата mrpit @ Подумал сейчас, а зачем я буду создавать какую-то отдельную программу с удалением файла. Ты же сам себе противоречишь: Цитата mrpit @ Это будет сделано для того, чтобы пользователь ничего не смог ручками менять в сетевой папке. Насколько я понял - твоя программа, запущенная под определенным пользователем, предоставляет пользователю доступ к общей папке, т.е. пользователь может внести какие то изменения в файлы этой папке. И этого ты хотел избежать. |
|
Сообщ.
#9
,
|
|
|
|
Так ещё раз ...
У меня есть программа которая должна обрабатывать файлы и класть их в защищенную папку. В защищенную папку должны попадать только те файлы, которые были обработаны программой и ей же туда помещены. Мне нужно было сделать так, чтобы сам пользователь не вносил в защищенную папку файлы минуя программу. Собственно решение проблемы вижу такой: Сделать программу оболочку которая с помощью CreateProcessWithLogonW будет запускать основную программу но уже под другим пользователем, который имеет доступ к защищенной папке. Конечно, логин и пароль будут зашиты в exe-шнике и их можно будет при желании оттуда вытащить, но в данном случае это не критично =) |
|
Сообщ.
#10
,
|
|
|
|
Цитата mrpit @ Сделать программу оболочку которая с помощью CreateProcessWithLogonW будет запускать основную программу но уже под другим пользователем, который имеет доступ к защищенной папке. Отлично. Главное ты уловил. В чем теперь проблема? |
|
Сообщ.
#11
,
|
|
|
|
Проблема теперь в другом. Программа запускается, имеет доступ к папке все хорошо.
Но в программе используется BDE, и запущенная под другим пользователем она выдает ошибку: 28/05/2010 is not valid date Думаю что это связанно с какими то настройками для даты у BDE но как мне настроить их под этого пользователя и вообще в какую сторону копать. |
|
Сообщ.
#12
,
|
|
|
|
Цитата mrpit @ Думаю что это связанно с какими то настройками для даты у BDE но как мне настроить их под этого пользователя и вообще в какую сторону копать. Я бы для начала запустил сие под тем пользователем, под которым с BDE все нормально работает. Убедился бы в полной работоспособности. Затем при помощи той же RegMonitor еще раз запустил и проверил - обращается ли хоть какой процесс этой программы к реестру. Варианты - программа хранит настройки BDE либо в пользовательском окружении (типа "Мои документы"), либо в ветке реестра пользователя. Разумеется, запущенная из под другого пользователя она не находит нужных данных. В свете этого тебе станет понятно - почему я предлагал сделать ТОЛЬКО передачу данных в сетевую папку из под ДРУГОГО пользователя. |
|
Сообщ.
#13
,
|
|
|
|
Ошибку "Is not valid date" поборол. Зашел под пользователем и изменил настройки реестра. И вроде бы все хорошо, но при запуске под другим пользователем выдает ошибку: "Table6: cannot modify a read-only dataset"
Под моим пользователем опять же работает без проблем, ошибок не выдает. Программу мониторинга скачал, по ней как я понял мне нужно смотреть ветку реестра HKEY_CURRENT_USER и обращения к папке "мои документы". Не нашел данных пунктов, хотя мож плохо смотрел, там до фига всяких обращений. Пытаюсь пока отладиться так =) |
|
Сообщ.
#14
,
|
|
|
|
С данной проблемой разобрался. У другого пользователя не было прав доступа к папке приложения. Открыл доступ все норм.
Но снова встала проблема. Запускаю программу под своим пользователем снова все норм. Захожу в виндовс под другим пользователем и запускаю программу тоже все норм. Но вот когда захожу в виндовс под своим пользователем, а запускаю программу путем: щелчок правой кнопокой мыши -> "Запуск от имени ..." то программа работает нормально!!! Но когда я запускаю программу программным путем с помощью CreateProcessWithLogonW ругается снова на формат даты "Is not valid date" Код оболочки для запуска: ![]() ![]() user := '***'; pass := '***'; domain := '***'; app := 'program.exe'; st.lpDesktop := nil; st.lpTitle := nil; st.dwFlags := STARTF_USESHOWWINDOW; if not CreateProcessWithLogonW( user, domain, pass, 0, app, nil, 0, nil, nil, st, ProcessInfo ) then begin FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER+FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError,LANG_NEUTRAL,@stp,0,0); ShowMessage('Ошибка: '+pchar(stp)); end; globalFlag := true; end else Close; |
|
Сообщ.
#15
,
|
|
|
|
Цитата mrpit @ Но вот когда захожу в виндовс под своим пользователем, а запускаю программу путем: щелчок правой кнопокой мыши -> "Запуск от имени ..." то программа работает нормально!!! Но когда я запускаю программу программным путем с помощью CreateProcessWithLogonW ругается снова на формат даты "Is not valid date" Хм...: Цитата По умолчанию, функция CreateProcessWithLogonW не загружает заданный профиль пользователя в ключ системного реестра HKEY_USERS. Это означает, что доступ к информации в ключе системного реестра HKEY_CURRENT_USER, не может достичь результатов совместимых с нормальным интерактивным входом в систему. Это является вашей ответственностью загрузить улей системного реестра пользователя в HKEY_USERS перед вызовом CreateProcessWithLogonW, используя, или LOGON_WITH_PROFILE, или вызывая функцию LoadUserProfile. Возможно стоит поэкспериментировать с флагом dwLogonFlags??? |