Почему 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 (или поставщик услуг, которого он пытается загрузить) ищет что-то там.