2009-10-12 8 views
5

Verwenden meines eigenen Programms oder anderer Ich kann Winsock nicht ausführen, wenn das Aufrufen des Prozesses mit CreateProcessWithLogonW oder CreateProcessAsUserW erstellt wird. Es gibt diesen Fehler zurück, wenn ich die Fassung zu erstellen:Warum lässt Windows nicht zu, dass WinSock gestartet wird, während sich ein anderer Benutzer ausgibt

WSAEPROVIDERFAILEDINIT 10106 

Dienstleister konnte nicht initialisiert werden.

The requested service provider could not be loaded or initialized. 

Dieser Fehler wird zurückgegeben, wenn entweder ein DLL des Service-Providers nicht geladen werden kann (Loadlibrary nicht) oder den Anbieter WSPStartup oder NSPStartup Funktion fehlgeschlagen

.

Allerdings scheint WSAStartup ohne einen Fehler zu gehen. Wenn Sie den Socket mit WSASocket erstellen, wird dies zurückgegeben.

UPDATE:

Fehler:

Loaduserprofile: Fehlercode 2. Datei kann nicht

AdjustTokenPrivs angegeben finden: Fehlercode 5. Zugriff verweigert

Antwort

3

Sie haben das Gesetz haben als Betrieb Priv

4

Vielleicht hat der Benutzer, den Sie ausgeführt haben, p rocess mit darf den TCP/IP Stack nicht benutzen?

Versuchen Sie, die Anwendung mit einem Administratorbenutzer zu starten, der nicht Ihr eigenes Konto ist.

+0

Mein Konto ist ein eingeschränktes Konto, das den Prozess erstellt, der Winsock als Administrator verwendet. Beide können den TCP/IP-Stack verwenden. Ich habe es sogar von einem Admin zum anderen versucht und es scheitert. –

0

Führen Sie Process Monitor darauf aus und prüfen Sie, ob eine Datei oder ein Registrierungsschlüssel nicht gefunden werden kann. Möglicherweise ist das Profil des imitierten Benutzers nicht geladen, und Winsock (oder ein Dienstanbieter, den es zu laden versucht) sucht dort nach etwas.

1

Möglicherweise fehlen Ihnen die erforderlichen Berechtigungen, um den Prozess als anderer Benutzer auszuführen. Versuchen Sie, das Handle für das Zugriffstoken durch einen Aufruf von OpenProcessToken abzurufen und SE_IMPERSONATE_NAME durch einen Aufruf von AdjustTokenPrivileges hinzuzufügen, und rufen Sie dann CreateProcessAsUserW auf. Ich habe das selbst nicht versucht.
Code snippet in Python to do something similar with win32 calls

+0

Auch wenn ich den Prozess als Admin ausführen AdjustTokenPrivs gibt ERROR_ACCESS_DENIED zurück. –

0

immer WinSock in der Nähe der Spitze des Hauptes beginnen und lassen Sie es läuft. Die Notwendigkeit, Winsock zu starten, ist ein Zufall der Architektur und kein Problemgebiet mehr.

3

Ich stieß genau auf das gleiche Problem und es lag an der Umgebung (!): Anscheinend erwartet WinSock, dass eine gültige SystemRoot Umgebungsvariable gesetzt wird. In meinem Fall habe ich CreateProcess() aufgerufen, indem ich nur eine für meine App spezifische Umgebungsvariable angegeben habe (ohne die Umgebung des Aufrufers zu vererben), und es ist fehlgeschlagen.

Überprüfen Sie, ob Sie Ihren Prozess erstellt haben, indem Sie entweder NULL an lpEnvironment übergeben, um die Umgebung des Aufrufers zu übernehmen, oder eine gültige Umgebungsvariable SystemRoot angeben.

Völlig undokumentiert AFAIK, aber es hat für mich funktioniert.

Verwandte Themen