Pourquoi Windows n’autorise-t-il pas le démarrage de WinSock lors de l’identification d’un autre utilisateur?

En utilisant mon propre programme ou d’autres, je ne peux pas exécuter winsock lors de l’appel si le processus est créé avec CreateProcessWithLogonW ou CreateProcessAsUserW. Il renvoie cette erreur lorsque je crée le socket:

WSAEPROVIDERFAILEDINIT 10106 

Le fournisseur de services n’a pas pu s’initialiser.

 The requested service provider could not be loaded or initialized. 

Cette erreur est renvoyée si la DLL d’un fournisseur de services n’a pas pu être chargée (LoadLibrary a échoué) ou la fonction WSPStartup ou NSPStartup du fournisseur a échoué

.

Cependant, WSAStartup semble aller sans erreur. Il suffit de créer le socket avec WSASocket.

METTRE À JOUR:

Les erreurs:

LoadUserProfile: Code d’erreur 2. Impossible de trouver le fichier spécifié

AdjustTokenPrivs: Code d’erreur 5. Accès refusé

Peut-être que l’utilisateur avec lequel vous avez exécuté le processus n’est pas autorisé à utiliser la stack TCP / IP?

Essayez de démarrer l’application avec un utilisateur administrateur qui n’est pas votre propre compte.

Vous devez avoir l’acte en tant que service d’exploitation

J’ai rencontré exactement le même problème et c’était dû à l’environnement (!): Apparemment, WinSock s’attend à ce qu’une variable d’environnement SystemRoot valide soit définie. Dans mon cas, CreateProcess() en spécifiant une seule variable d’environnement spécifique à mon application (sans hériter de l’environnement de l’appelant), et cela échouait.

Vérifiez que vous avez créé votre processus en transmettant NULL à lpEnvironment pour hériter de l’environnement de l’appelant ou spécifiez une variable d’environnement SystemRoot valide.

AFAIK complètement sans papiers, mais cela a fonctionné pour moi.

Peut-être que vous n’avez pas les privilèges requirejs pour exécuter le processus en tant qu’autre utilisateur. Essayez d’obtenir le handle du jeton d’access par un appel à OpenProcessToken et ajoutez SE_IMPERSONATE_NAME par un appel à AdjustTokenPrivileges, puis appelez CreateProcessAsUserW. Je n’ai pas essayé moi-même cependant.
Extrait de code en Python pour faire quelque chose de similaire avec les appels win32

Exécutez Process Monitor sur elle et voyez si elle ne parvient pas à trouver un fichier ou une clé de registre. Peut-être le profil de l’utilisateur emprunté n’est-il pas chargé et Winsock (ou un fournisseur de services qu’il essaie de charger) y cherche quelque chose.

Toujours démarrer WinSock près du haut de la page principale et le laisser tourner. La nécessité de démarrer winsock est un accident d’architecture et ne concerne plus aucun problème.