Обход ограничения ОС Windows, запрещающего несколько подключений к серверу/общему ресурсу

Мы строим систему на окнах, где нам централизованно (сервер) нужно делать fopen либо к локальным файлам, либо к удаленным ресурсам smb. Идея состоит в том, чтобы аутентифицироваться в случае удаленных ресурсов перед выполнением fopen (с путями unc). Нам нужно аутентифицироваться с помощью учетных данных, предоставленных пользователем (клиентским приложением) для этого ресурса на этом удаленном общем ресурсе. Мы не хотим копировать какие-либо ресурсы.

При использовании Win Net Api это работает гладко, поскольку он сохраняет данные учетные данные, чтобы последующие попытки в том же или в разных процессах были успешными.

Но есть проблема: многие из вас, вероятно, знают следующее сообщение от Windows при попытке подключения к общему ресурсу smb с учетными данными, отличными от тех, которые использовались для предыдущего подключения: «Несколько подключений к серверу или общему ресурсу одним и тем же пользователем, использование более одного имени пользователя не допускается. Отключите все предыдущие подключения к серверу или общему ресурсу и повторите попытку." См. http://support.microsoft.com/kb/938120 для определенных ограничений и возможных " работа вокруг».

Поскольку у нас есть приложение центрального сервера, работающее как служба (учетная запись «Локальная система»), мы преодолеваем это ограничение, имея уже двух разных пользователей :). Закрытие ранее установленного соединения, чтобы разрешить второе, не является вариантом (текущая обработка).

С одной стороны, это здорово, что Windows кэширует информацию об аутентификации, с другой стороны, это слишком ограничено. Изменение файла hosts для каждого пользователя выглядит не очень красиво. Использование клиентских библиотек smb (таких как libsmb++, impacket) не кажется решением, поскольку нам нужна аутентификация «поверх процесса». Настройка «главного» пользователя общего доступа smb также нежелательна. Может быть, передача токенов аутентификации пользователя Windows - это способ?

Эта проблема носит общий характер (т.е. не зависит от языка), и я убежден, что есть люди, которые решили ее (более или менее элегантным способом ;)) Надеюсь, мое объяснение понятно.

Заранее спасибо за любую подсказку. Феликс


person felix    schedule 16.06.2014    source источник
comment
Передача токенов доступа (через ImpersonateLoggedOnUser и друзей) выглядит как путь сюда.   -  person Neil    schedule 16.06.2014
comment
Обратите внимание, что когда он говорит о том же пользователе, это действительно означает тот же сеанс входа в систему. Каждая служба (например) будет иметь свой собственный сеанс входа в систему (IIRC), даже если несколько служб используют одну и ту же учетную запись. Вы также можете создавать новые сеансы входа в систему, используя LogonUser и связанные функции.   -  person Harry Johnston    schedule 17.06.2014
comment
Олицетворение — хорошая идея, но она не будет работать, если клиент и служба не работают на одной машине, верно. Создание новых сеансов входа в систему очень интересно. Спасибо! Посмотрим на это.   -  person felix    schedule 17.06.2014
comment
Вы можете олицетворять созданный вами сеанс входа в систему, хотя я не знаю, как именно олицетворение взаимодействует с SMB. Если это сработает, это может избавить вас от необходимости иметь несколько процессов.   -  person Harry Johnston    schedule 18.06.2014
comment
Возможный дубликат Войдите в систему Windows общий сетевой ресурс (SMB) только для этого процесса   -  person Jonathan Allon    schedule 24.04.2017