На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Доступ к файлу/папке под сетевым пользователем , Как подключиться к сетевой папке, зная логин и пароль пользователя?
    Здравствуйте, уважаемые форумчане!
    Возник такой вопрос. Есть программа, которая работает с файлом, который находится в определенной папке.
    Папка находится в сети на другом компьютере. Пользователь, который запускает программу, не имеет доступа к папке. Но мы знаем логин и пароль пользователя сети, который имеет доступ к папке. Как программно подключиться к папке под нужным сетевым пользователем.

    Это будет сделано для того, чтобы пользователь ничего не смог ручками менять в сетевой папке. Вся обработка файлов ведется только программой.

    Если это возможно подскажите, в какую сторону копать или ссылки на мануалы. С сетью в делфи не работал, хочется чего-то доступного и понятного. Желательно в стандартном наборе.

    Заранее большое спасибо.
    Сообщение отредактировано: CodeMonkey -
      Цитата mrpit @
      Есть программа, которая работает с файлом, который находится в определенной папке.
      Папка находится в сети на другом компьютере.

      Цитата mrpit @
      Как программно подключиться к папке под нужным сетевым пользователем.
      Т.е. нужно из под одного пользователя запустить эту программу, но с правами другого? Или создать другую программу, которая будет что то делать с файлом в сети?
        Опишу подробней, видимо не очень понятно написал.
        Есть пользователь, который будет запускать программу. Программа обрабатывает файл пользователя и кладет его в определенную папку в сети (назовем эту папку "защищенной"). В "Защищенную" папку сетевой пользователь, запустивший программу, попасть не может, но нужно сделать так, чтобы программа подключилась под другим сетевым пользователем (в программе будут зашиты логин и пароль) и поместила обработанный файл в "защищенную" папку.
          Цитата mrpit @
          Программа обрабатывает файл пользователя и кладет его в определенную папку в сети (назовем эту папку "защищенной")

          Программа обработает файл пользователя, затем запускает дополнительный (консольный, как вариант) процесс с правами другого пользователя, передает ему параметры (как вариант, в виде пути к промежуточному, уже обработанному файлу на локальном компе). Данный процесс тупо копирует файл на сетевой ресурс (он запущен с нужными правами доступа посредством CreateProcessWithLogonW) и заканчивает работу. Программа, дождавшись окончания этого процесса, удаляет промежуточный файл с локального диска и завершает работу. Так подойдет? :)
            Да! Возможен и такой вариант, в принципе без разницы будет зашито все в одной программе или будет еще дополнительный процесс (как я понимаю это в простейшем варианте какой-нибудь bat-файл). Спасибо большое за подсказку.
            Ещё бы примерами кода разбавить ответ, если несложно.=)
              Цитата mrpit @
              Ещё бы примерами кода разбавить ответ, если несложно.=)

              Так я же тебе АПИ функцию запуска процесса дал. Формируй необходимые для запуска процесса структуры (типа STARTUPINFO) и все. А сам процесс будет запускаться из файла (да хоть тот же батник), который предварительно можно откомпилировать (если не батник) и засунуть в ресурсы программы, которая будет запускать его, предварительно достав из ресурса и сохранив на диск, а после отработки и завершения - удалять ЕХЕ файл с диска (как вариант). :D
                Подумал сейчас, а зачем я буду создавать какую-то отдельную программу с удалением файла. Можно же просто сделать оболочку для запуска моей уже написанной программы. Просто она будет запускаться из под нужного пользователя.
                  Цитата mrpit @
                  Подумал сейчас, а зачем я буду создавать какую-то отдельную программу с удалением файла.

                  Ты же сам себе противоречишь:
                  Цитата mrpit @
                  Это будет сделано для того, чтобы пользователь ничего не смог ручками менять в сетевой папке.

                  :D Насколько я понял - твоя программа, запущенная под определенным пользователем, предоставляет пользователю доступ к общей папке, т.е. пользователь может внести какие то изменения в файлы этой папке. И этого ты хотел избежать. :)
                    Так ещё раз ...
                    У меня есть программа которая должна обрабатывать файлы и класть их в защищенную папку. В защищенную папку должны попадать только те файлы, которые были обработаны программой и ей же туда помещены.
                    Мне нужно было сделать так, чтобы сам пользователь не вносил в защищенную папку файлы минуя программу.

                    Собственно решение проблемы вижу такой:
                    Сделать программу оболочку которая с помощью CreateProcessWithLogonW будет запускать основную программу но уже под другим пользователем, который имеет доступ к защищенной папке. Конечно, логин и пароль будут зашиты в exe-шнике и их можно будет при желании оттуда вытащить, но в данном случае это не критично =)
                      Цитата mrpit @
                      Сделать программу оболочку которая с помощью CreateProcessWithLogonW будет запускать основную программу но уже под другим пользователем, который имеет доступ к защищенной папке.

                      Отлично. Главное ты уловил. В чем теперь проблема? :D
                        Проблема теперь в другом. Программа запускается, имеет доступ к папке все хорошо.
                        Но в программе используется BDE, и запущенная под другим пользователем она выдает ошибку:
                        28/05/2010 is not valid date
                        Думаю что это связанно с какими то настройками для даты у BDE но как мне настроить их под этого пользователя и вообще в какую сторону копать.
                          Цитата mrpit @
                          Думаю что это связанно с какими то настройками для даты у BDE но как мне настроить их под этого пользователя и вообще в какую сторону копать.

                          Я бы для начала запустил сие под тем пользователем, под которым с BDE все нормально работает. Убедился бы в полной работоспособности. Затем при помощи той же RegMonitor еще раз запустил и проверил - обращается ли хоть какой процесс этой программы к реестру. Варианты - программа хранит настройки BDE либо в пользовательском окружении (типа "Мои документы"), либо в ветке реестра пользователя. Разумеется, запущенная из под другого пользователя она не находит нужных данных. В свете этого тебе станет понятно - почему я предлагал сделать ТОЛЬКО передачу данных в сетевую папку из под ДРУГОГО пользователя. :D
                            Ошибку "Is not valid date" поборол. Зашел под пользователем и изменил настройки реестра. И вроде бы все хорошо, но при запуске под другим пользователем выдает ошибку: "Table6: cannot modify a read-only dataset"
                            Под моим пользователем опять же работает без проблем, ошибок не выдает.
                            Программу мониторинга скачал, по ней как я понял мне нужно смотреть ветку реестра
                            HKEY_CURRENT_USER и обращения к папке "мои документы". Не нашел данных пунктов, хотя мож плохо смотрел, там до фига всяких обращений.
                            Пытаюсь пока отладиться так =)
                              С данной проблемой разобрался. У другого пользователя не было прав доступа к папке приложения. Открыл доступ все норм.
                              Но снова встала проблема.
                              Запускаю программу под своим пользователем снова все норм.
                              Захожу в виндовс под другим пользователем и запускаю программу тоже все норм.

                              Но вот когда захожу в виндовс под своим пользователем, а запускаю программу путем:
                              щелчок правой кнопокой мыши -> "Запуск от имени ..."
                              то программа работает нормально!!!

                              Но когда я запускаю программу программным путем с помощью CreateProcessWithLogonW ругается снова на формат даты "Is not valid date"

                              Код оболочки для запуска:
                              ExpandedWrap disabled
                                    
                                    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;
                              Сообщение отредактировано: mrpit -
                                Цитата mrpit @
                                Но вот когда захожу в виндовс под своим пользователем, а запускаю программу путем:
                                щелчок правой кнопокой мыши -> "Запуск от имени ..."
                                то программа работает нормально!!!

                                Но когда я запускаю программу программным путем с помощью CreateProcessWithLogonW ругается снова на формат даты "Is not valid date"

                                Хм...:
                                Цитата
                                По умолчанию, функция CreateProcessWithLogonW не загружает заданный профиль пользователя в ключ системного реестра HKEY_USERS. Это означает, что доступ к информации в ключе системного реестра HKEY_CURRENT_USER, не может достичь результатов совместимых с нормальным интерактивным входом в систему. Это является вашей ответственностью загрузить улей системного реестра пользователя в HKEY_USERS перед вызовом CreateProcessWithLogonW, используя, или LOGON_WITH_PROFILE, или вызывая функцию LoadUserProfile.

                                Возможно стоит поэкспериментировать с флагом dwLogonFlags???
                                  medved_68
                                  Спасибо вам огромное, наконец-то вроде все заработало.
                                  Спасибо что так помогли лузеру. =) :good:
                                    mrpit, есть полезная ссылочка "Вопрос решён". Её надо-бы тыркнуть, дабы отметить тему как решённую.
                                      mrpit
                                      Как решили проблему опишите пожалуйста.
                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                      0 пользователей:


                                      Рейтинг@Mail.ru
                                      [ Script execution time: 0.1048 ]   [ 16 queries used ]   [ Generated: 25.08.26, 14:56 GMT ]