Мы строим систему на окнах, где нам централизованно (сервер) нужно делать fopen либо к локальным файлам, либо к удаленным ресурсам smb. Идея состоит в том, чтобы аутентифицироваться в случае удаленных ресурсов перед выполнением fopen (с путями unc). Нам нужно аутентифицироваться с помощью учетных данных, предоставленных пользователем (клиентским приложением) для этого ресурса на этом удаленном общем ресурсе. Мы не хотим копировать какие-либо ресурсы.
При использовании Win Net Api это работает гладко, поскольку он сохраняет данные учетные данные, чтобы последующие попытки в том же или в разных процессах были успешными.
Но есть проблема: многие из вас, вероятно, знают следующее сообщение от Windows при попытке подключения к общему ресурсу smb с учетными данными, отличными от тех, которые использовались для предыдущего подключения: «Несколько подключений к серверу или общему ресурсу одним и тем же пользователем, использование более одного имени пользователя не допускается. Отключите все предыдущие подключения к серверу или общему ресурсу и повторите попытку." См. http://support.microsoft.com/kb/938120 для определенных ограничений и возможных " работа вокруг».
Поскольку у нас есть приложение центрального сервера, работающее как служба (учетная запись «Локальная система»), мы преодолеваем это ограничение, имея уже двух разных пользователей :). Закрытие ранее установленного соединения, чтобы разрешить второе, не является вариантом (текущая обработка).
С одной стороны, это здорово, что Windows кэширует информацию об аутентификации, с другой стороны, это слишком ограничено. Изменение файла hosts для каждого пользователя выглядит не очень красиво. Использование клиентских библиотек smb (таких как libsmb++, impacket) не кажется решением, поскольку нам нужна аутентификация «поверх процесса». Настройка «главного» пользователя общего доступа smb также нежелательна. Может быть, передача токенов аутентификации пользователя Windows - это способ?
Эта проблема носит общий характер (т.е. не зависит от языка), и я убежден, что есть люди, которые решили ее (более или менее элегантным способом ;)) Надеюсь, мое объяснение понятно.
Заранее спасибо за любую подсказку. Феликс
ImpersonateLoggedOnUser
и друзей) выглядит как путь сюда. - person Neil   schedule 16.06.2014LogonUser
и связанные функции. - person Harry Johnston   schedule 17.06.2014