Почему Windows не позволяет запускать WinSock при олицетворении другого пользователя

Используя мою собственную программу или другие программы, я не могу запустить winsock при вызове, если процесс создан с помощью CreateProcessWithLogonW или CreateProcessAsUserW. Это возвращает эту ошибку, когда я создаю сокет:

WSAEPROVIDERFAILEDINIT 10106

Поставщик услуг не смог инициализироваться.

The requested service provider could not be loaded or initialized.

Эта ошибка возвращается, если DLL-библиотека поставщика услуг не может быть загружена (сбой LoadLibrary) или функция WSPStartup поставщика или NSPStartup не выполнена

,

Тем не мение, WSAStartup кажется, идет без ошибки. Просто создание сокета с WSASocket возвращает это.

ОБНОВИТЬ:

Ошибки:

LoadUserProfile: код ошибки 2. Не удается найти указанный файл

AdjustTokenPrivs: код ошибки 5. Доступ запрещен

6 ответов

Решение

Вы должны иметь Акт Действующего Приват

Я столкнулся с точно такой же проблемой, и это было связано с окружающей средой (!): Видимо WinSock ожидает действительный SystemRoot переменная окружения, которая будет установлена. В моем случае я звонил CreateProcess() указав только одну переменную среды, специфичную для моего приложения (без наследования среды вызывающего), и это не помогло.

Убедитесь, что вы создали свой процесс, передавая NULL в lpEnvironment наследовать среду вызывающего абонента или указать действительный SystemRoot переменная окружения.

Полностью недокументированный AFAIK, но у меня это сработало.

Возможно, пользователю, с которым вы выполняли процесс, не разрешено использовать стек TCP/IP?

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

Возможно, вам не хватает необходимых привилегий для запуска процесса от имени другого пользователя. Попробуйте получить дескриптор токена доступа с помощью вызова OpenProcessToken, добавьте SE_IMPERSONATE_NAME с помощью вызова AdjustTokenPrivileges, а затем вызовите CreateProcessAsUserW. Я не пробовал это сам, хотя.
Фрагмент кода в Python, чтобы сделать нечто подобное с вызовами win32

Всегда запускайте WinSock в верхней части главного и оставляйте его включенным. Необходимость запуска winsock - это случайность архитектуры, которая больше не связана с какой-либо проблемной областью.

Запустите на нем Process Monitor и посмотрите, не удается ли найти файл или раздел реестра. Возможно, профиль олицетворенного пользователя не загружен, и Winsock (или поставщик услуг, которого он пытается загрузить) ищет что-то там.

Другие вопросы по тегам