Почему 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. Отказано в доступе


person Christopher Tarquini    schedule 12.10.2009    source источник


Ответы (6)


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

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

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

person Nico    schedule 20.01.2011

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

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

person Yannick Motton    schedule 12.10.2009
comment
Моя учетная запись — это ограниченная учетная запись, которая создает процесс, использующий winsock в качестве администратора. Оба могут использовать стек TCP/IP. Я даже пробовал от одного администратора к другому, и это терпит неудачу. - person Christopher Tarquini; 12.10.2009

Вы должны иметь Act As Operating Priv

person Christopher Tarquini    schedule 19.10.2009

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

person hackworks    schedule 14.10.2009
comment
Даже когда я запускаю процесс от имени администратора, AdjustTokenPrivs возвращает ERROR_ACCESS_DENIED. - person Christopher Tarquini; 15.10.2009

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

person Luke    schedule 12.10.2009

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

person Joshua    schedule 19.10.2009