2012-02-05 14 views
12

Sto cercando di ottenere un nome di processo dal suo pid. L'utente è in esecuzione come amministratore, abilitato al controllo dell'account utente, non elevato.Come ottenere un nome file di processo da pid, se OpenProcess() fallisce con ACCESS_DENIED?

Alcuni processi di sistema, come services.exe, hanno la sicurezza impostata in modo tale che OpenProcess(PROCESS_QUERY_INFORMATION ... non riesce con ERROR_ACCESS_DENIED. Stesso risultato con il diritto di accesso PROCESS_QUERY_LIMITED_INFORMATION. Tuttavia, posso vedere che Process Explorerpuò almeno elencare tutti questi processi, insieme al loro pid e nome file (quando si esegue come amministratore non elevato).

La mia domanda è, come posso fare lo stesso (ottenere il nome del file da pid), dato che l'amministratore non elevato non può seguire il solito percorso di OpenProcess() + GetProcessImageFileName()?

risposta

9

Hai provato Process32First() e Process32Next() con un manico recuperato da CreateToolhelp32Snapshot()? Non ti dà il percorso completo, ma dovrebbe almeno consentire di ottenere il nome del file.

+0

Grazie Jim, è stato un suggerimento brillante. Se qualcuno ha bisogno di un esempio, ecco un [MSDN uno] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686701%28v=vs.85%29.aspx) – baderman

3

Hai provato il PROCESS_QUERY_LIMITED_INFORMATION? Richiede un livello inferiore di accesso che può fornire almeno il nome dell'eseguibile. Esso consente di chiamare QueryFullProcessImageName che fornisce le informazioni che state cercando

+1

Mi dispiace, ho modificato poco prima che tu rispondessi. Sì, ho provato questo, e non aiuta. Errore di accesso uguale negato. – haimg

+1

L'handle di un processo di sistema aperto con PROCESS_QUERY_LIMITED_INFORMATION non consente di chiamare QueryFullProcessImageName. Fallisce con errore 31 "Un dispositivo collegato al sistema non funziona." anche quando il mio programma funziona con diritti di amministratore completi (senza il privilegio SE_DEBUG). –

5

Non è possibile aprire processi di sistema (più precisamente, processi in esecuzione con un altro account, in questo caso SISTEMA utente) senza il privilegio SE_DEBUG abilitato per il processo. Se si sta eseguendo come amministratore, è possibile impostare facilmente il privilegio: http://support.microsoft.com/kb/131065/en-us

+1

Questo articolo è un po ' obsolete. Sfortunatamente, non è possibile ottenere SeDebugPrivilege se non elevato (UAC). – haimg

+0

@haimg: ho cercato su Google un po 'ma non ho trovato nulla su questo, hai qualche link dove dice questo? – pezcode

+1

L'ho provato nel mio codice ... Tuttavia, guarda qui: http://msdn.microsoft.com/en-us/library/bb530410.aspx. Dice che SeDebugPrivilege viene rimosso da un token limitato (per l'amministratore). – haimg

Problemi correlati