Почему Windows не позволяет запускать WinSock при олицетворении другого пользователя - PullRequest
6 голосов
/ 12 октября 2009

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

WSAEPROVIDERFAILEDINIT 10106

Провайдеру не удалось инициализироваться.

The requested service provider could not be loaded or initialized.

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

.

Однако, WSAStartup, похоже, идет без ошибки. Просто создание сокета с WSASocket возвращает это.

UPDATE:

Ошибка:

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

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

Ответы [ 6 ]

5 голосов
/ 20 января 2011

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

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

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

3 голосов
/ 19 октября 2009

Вы должны иметь действующее право деятельности

3 голосов
/ 12 октября 2009

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

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

1 голос
/ 14 октября 2009

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

0 голосов
/ 19 октября 2009

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

0 голосов
/ 12 октября 2009

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

...