2009-10-12 27 views
5

Uso de mi propio programa u otros No puedo obtener winsock para que se ejecute al llamar si el proceso se crea con CreateProcessWithLogonW o CreateProcessAsUserW. Se devuelve este error al crear el socket:Por qué Windows no permite que WinSock se inicie mientras se hace pasar por otro usuario

WSAEPROVIDERFAILEDINIT 10106 

proveedor de servicio no se puede inicializar.

The requested service provider could not be loaded or initialized. 

Este error se devuelve si bien una DLL de proveedor de servicio no podría ser cargado (Error de LoadLibrary) o WSPStartup del proveedor o NSPStartup función no

.

Sin embargo, WSAStartup parece ir sin un error. Solo crear el socket con WSASocket lo devuelve.

ACTUALIZACIÓN:

Errores:

LoadUserProfile: Código de error 2. no puede encontrar el archivo especificado

AdjustTokenPrivs: Código de error 5. Acceso denegado

Respuesta

3

Tienes que tener la Ley Como Priv operativo

4

Quizás el usuario haya ejecutado el p rocess with no tiene permitido usar la pila TCP/IP?

Intente iniciar la aplicación con un usuario administrador que no sea su propia cuenta.

+0

Mi cuenta es una cuenta limitada que está creando el proceso que utiliza winsock como administrador. Ambos pueden usar la pila TCP/IP. Incluso probé de un administrador a otro y falla. –

0

Ejecute Process Monitor en él y vea si no puede encontrar un archivo o clave de registro. Quizás el perfil del usuario suplantado no está cargado y Winsock (o un proveedor de servicios que está intentando cargar) está buscando algo allí.

1

Puede carecer de los privilegios necesarios para ejecutar el proceso como otro usuario. Intente obtener el identificador del token de acceso mediante una llamada a OpenProcessToken y agregue SE_IMPERSONATE_NAME con una llamada a AdjustTokenPrivileges y luego llame a CreateProcessAsUserW. Aunque no lo intenté yo mismo.
Code snippet in Python to do something similar with win32 calls

+0

Incluso cuando ejecuto el proceso como administrador, AdjustTokenPrivs devuelve ERROR_ACCESS_DENIED. –

0

empezar siempre WinSock cerca de la parte superior del principal y dejarla funcionar. La necesidad de iniciar winsock es un accidente de la arquitectura y ya no está en el dominio de ningún problema.

3

Me encontré con exactamente el mismo problema y fue debido al entorno (!): Aparentemente WinSock espera que se establezca una variable de entorno SystemRoot válida. En mi caso, estaba llamando al CreateProcess() al especificar solo una variable de entorno específica para mi aplicación (sin heredar el entorno de la persona que llama), y estaba fallando.

Compruebe que ha creado su proceso pasando NULL a lpEnvironment para heredar el entorno de la persona que llama, o especifique una variable de entorno válida SystemRoot.

AFAIK completamente indocumentado, pero funcionó para mí.

Cuestiones relacionadas