2009-10-12 13 views
5

Uso del mio programma o di altri Non riesco a eseguire winsock quando si chiama se il processo è stato creato con CreateProcessWithLogonW o CreateProcessAsUserW. Esso restituisce questo errore quando creo la presa:Perché Windows non consente l'avvio di WinSock mentre si impersona un altro utente

WSAEPROVIDERFAILEDINIT 10106 

fornitore Impossibile inizializzare il servizio.

The requested service provider could not be loaded or initialized. 

Questo errore viene restituito se DLL o un provider di servizi non poteva essere caricato (LoadLibrary non riuscita) o WSPStartup del provider o NSPStartup funzione non è riuscita

.

Tuttavia, WSAStartup sembra andare senza un errore. Solo la creazione del socket con WSASocket restituisce questo.

UPDATE:

Errori:

LoadUserProfile: Codice di errore 2. Impossibile trovare il file specificato

AdjustTokenPrivs: Codice Errore 5. Accesso negato

risposta

3

Bisogna avere la legge Come Priv operativo

4

Forse l'utente ha eseguito il p rocess con non è permesso usare lo stack TCP/IP?

Provare ad avviare l'applicazione con un utente amministratore che non è il proprio account.

+0

Il mio account è un account limitato che sta creando il processo che utilizza Winsock come amministratore. Entrambi possono utilizzare lo stack TCP/IP. Ho anche provato da un amministratore all'altro e fallisce. –

0

Esegui Process Monitor su di esso e controlla se non riesce a trovare un file o una chiave di registro. Forse il profilo dell'utente rappresentato non viene caricato e Winsock (o un fornitore di servizi che sta tentando di caricare) sta cercando qualcosa lì.

1

Potrebbe non essere necessario disporre dei privilegi necessari per eseguire il processo come un altro utente. Prova ad ottenere l'handle del token di accesso con una chiamata a OpenProcessToken e aggiungi SE_IMPERSONATE_NAME con una chiamata a AdjustTokenPrivileges e quindi chiama CreateProcessAsUserW. Non ho provato questo me stesso però.
Code snippet in Python to do something similar with win32 calls

+0

Anche quando eseguo il processo come un Admin AdjustTokenPrivs restituisco ERROR_ACCESS_DENIED. –

0

Iniziare sempre WinSock vicino alla cima della principale e lasciarlo in esecuzione. La necessità di avviare Winsock è un incidente di architettura e non riguarda più alcun dominio problematico.

3

Ho riscontrato esattamente lo stesso problema ed era dovuto all'ambiente (!): Apparentemente WinSock si aspetta una variabile di ambiente SystemRoot valida da impostare. Nel mio caso, stavo chiamando CreateProcess() specificando solo una variabile d'ambiente specifica per la mia app (senza ereditare l'ambiente del chiamante) e non funzionava.

Verificare di aver creato il processo passando da NULL a lpEnvironment per ereditare l'ambiente del chiamante o specificare una variabile di ambiente valida SystemRoot.

Completamente privo di documenti AFAIK, ma ha funzionato per me.

Problemi correlati