Domanda

Ho un eseguibile di Windows che viene lanciato dall'interno di un servizio chiamando CreateProcessWithLogonW () con una serie di specfied dettagli utente.

Questo funziona bene e il processo inizia come previsto. Tuttavia, quando questo processo tenta di lanciare altri processi si, attualmente solo utilizzando CreateProcess () Questi cominciano poi muoiono subito -. Sono eseguibili che richiedono l'accesso desktop

Dopo aver letto su un articolo di Microsoft sul CreateProcess () - http://msdn.microsoft.com/en-us/library/ms682425 (VS.85) aspx

Credo può vedere perché questo sta accadendo e ha senso in una certa misura. CreateProcess () sa che il processo chiamante sta impersonando un utente in modo che utilizza il suo processo genitore, che in questo caso è l'account di sistema locale. Ma naturalmente nulla eseguito con l'account di sistema locale non ha l'accesso abbiamo bisogno, in modo che il processo avviato muore.

Stranamente quando stavo in precedenza utilizzando LogonUser () e CreateProcessAsUser () per lanciare l'eseguibile iniziale entro il servizio, ha funzionato bene. Ma ho dovuto cambiare questo per CreateProcessWithLogonW () a causa di problemi con non avere i privilegi corretti.

Qualcuno sa di una soluzione a questo? Ho visto parlare di questo altrove sul web, ma non con qualsiasi soluzione definitiva. Mi sembra di avere bisogno del token dell'utente sto effettuando il log in a CreateProcessWithLogonW () con così posso usarlo per lanciare altri processi più tardi? Ma non ho modo di entrare in possesso di questo segno, questo può essere recuperato i per l'utente corrente in qualche modo?

Qualsiasi aiuto sarebbe molto apprezzato, grazie:)

È stato utile?

Soluzione

Possiedi il codice lanciato utilizzando CreateProcessWithLogonW (e che a sua volta chiama CreateProcess)? Se poi non si potrebbe essere necessario eseguire IAT (o API) di aggancio su di esso (cioè a run-time), da sostituire eventuali chiamate al CreateProcess con apposita procedura che utilizza anche CreateProcessWithLogonW o CreateProcessWithTokenW. Vedere APIHijack , Detours .

Dopo aver fatto questo, il processo figlio può richiedere l'accesso a HKCU. Se non si sta già facendo questo, si dovrebbe caricare il profilo di ogni utente rappresentato, una volta per ogni utente, prima di chiamare CreateProcessWithLogonW.

  

Per impostazione predefinita, CreateProcessWithLogonW   non viene caricato l'utente specificato   profilo nel Registro di sistema HKEY_USERS   chiave. Ciò significa che l'accesso ai   informazioni in HKEY_CURRENT_USER   chiave di Registro di sistema non può produrre risultati   che sono coerenti con un normale   accesso interattivo. È tuo   responsabilità per caricare l'utente   hive di registro in HKEY_USERS prima   chiamando CreateProcessWithLogonW, da   utilizzando LOGON_WITH_PROFILE, oppure   chiamando la funzione LoadUserProfile.

Altri suggerimenti

Abbiamo risolto il problema utilizzando un codice che ho trovato di tanto tempo fa. La sezione "copyright" di uno dei moduli di origine contiene il seguente:

/////////////////////////////////////////////////////////////
// CreateProcessAsUser.cpp
// 
// Written by Valery Pryamikov (1999)
// 
// Command line utility that executes a command under specified user identity 
// by temporarily installing itself as a service.
//
// Based on Keith Brown's AsLocalSystem utility (http://www.develop.com/kbrown)
// Uses some code from Mike Nelson's dcomperm sample utility 
//   and from tlist sample (Microsoft Source Code Samples)
//
// Use:
//  CreateProcessAsUser.exe [-i[nteractive]]|[-s[ystem]]|
//       [-u"UserName" -d"DomainName" -p"Password"]|[-a"AppID"] command
//  Command must begin with the process (path to the exe file) to launch
//  -i        process will be launched under credentials of the 
//            "Interactive User" (retrieved from winlogon\shell process)
//  -a        process will be launched under credentials of the user 
//            specified in "RunAs" parameter of AppID.
//  -s        process will be launched as local system
//  -u -d -p  process will be launched on the result token of the 
//            LogonUser(userName,domainName,password,LOGON32_LOGON_BATCH...)
//
// either (-s) or (-i) or (-a) or (-u -d -p) parameters must supplied
// 
// Examples:
// CreateProcessAsUser -s cmd.exe
// CreateProcessAsUser -a"{731A63AF-2990-11D1-B12E-00C04FC2F56F}" winfile.exe
//
/////////////////////////////////////////////////////////////

Forse questa informazione sarà resa colpi entro le ricerche di Google - Ho tentato un paio di tentativi veloci, ma è venuto a mani vuote. Abbiamo scomposto l'interno in un insieme di API che ha dato i risultati che abbiamo bisogno.

Non c'è un'opzione per i servizi per consentire loro di interagire con il desktop? Se l'impostazione che l'opzione per il vostro servizio è una possibilità, che sarebbe probabilmente la soluzione più semplice.

sto supponendo che questo processo è un servizio; quanto non specificato nella domanda, ma sembra logico dato che è in esecuzione come account di sistema locale.

Dove stai ricevendo bloccato non è in CreateProcess, E 'in CreateService . Se si desidera che il servizio sia in grado di interagire con il desktop, è necessario specificare SERVICE_INTERACTIVE_PROCESS come una delle bandiere al dwServiceType argomento. Questa impostazione viene ereditata da processi secondari del servizio.

È inoltre possibile modificare l'impostazione di un servizio esistente utilizzando lo strumento Servizi, selezionare Proprietà per il servizio, cliccare su "Log On" scheda e selezionare la casella di controllo "Consenti al servizio di interagire con il desktop".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top