2009-08-16 20 views
5

Desidero scrivere una piccola app che si trova nel mio vassoio e che mi consente di selezionare un eseguibile e impedirne l'apertura.Come arrestare un'applicazione dall'apertura

L'interfaccia utente dell'applicazione è semplice da utilizzare con WinForms.

Quello che voglio sapere è come rilevare se un certo exe è stato lanciato e poi come fermarlo. Sono abbastanza sicuro che dovrò scavare in qualche roba Win32 ma non ho esperienza in quell'area, quindi questo post.

C'è un'app esistente simile a questa, ma non posso per la vita di me ricordare come si chiama. È stato scritto in VB6 ed è anche open source.

Qualsiasi aiuto è molto apprezzato.

Grazie.

+2

Perché vuoi per fermare l'applicazione apertura? E non sarebbe meglio limitare semplicemente le autorizzazioni dell'utente in modo che l'applicazione non possa essere aperta? –

+0

Sì, ho esaminato le norme di gruppo, ma ho scoperto che le app possono ancora essere caricate dal CMD, quindi devo disabilitare anche quelle che non voglio fare. – Spidey

+1

No, è possibile impostare l'ACL sui file stessi in modo che non possano essere eseguiti. –

risposta

9

Piuttosto che cercare di interrompere il processo quando è in esecuzione, che ne dici di interromperlo dall'inizio?

Cambiare che cosa accade quando la shell tenta di avviare un'applicazione è semplice - aggiungere una nuova chiave del Registro di HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File Execution Options

di testare questo ho aggiunto una chiave di registro denominata notepad.exe e al suo interno il valore stringa Debugger con il valore calc.exe.Ora ogni volta che cerco di eseguire il blocco note, calc si apre. La seguente è la chiave di registro esportata.

REGEDIT4 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe] 
"Debugger"="calc.exe" 

Fatta questa modifica non ho ancora riuscito ad aprire il Blocco note, non male per una soluzione di alcun codice. Se è necessario essere sicuri al 100% che l'applicazione non venga mai eseguita, è sempre possibile aggiungere una soluzione "kill" come descritto da altri.

+0

Questo è un ottimo metodo per Stephen. Posso aggiungere questo all'app ora, invece di eseguire il polling ogni 10 secondi, cambia semplicemente il registro una volta. Dolce. – Spidey

0

Ricordo alcune funzionalità di Win32 che aiutano a risolvere tali scenari. Se stai usando .Net comunque, probabilmente sarebbe un dolore da implementare. Vorrei utilizzare alcuni degli oggetti di sincronizzazione tra processi (non so fuori dalla testa quali sono processi incrociati) e impostarei un segnale. All'avvio basta che la tua app verifichi se il segnale è già impostato. Se sì, chiudi di nuovo l'app.

0

Una delle idee, ma non la migliore, è osservare i processi in esecuzione e uccidere il processo in esecuzione necessario quando trovato, questo può essere fatto con il normale codice C# gestito.

+0

sì, questo è il metodo che sto usando finora. Questo chiuderà l'app dopo che è stata aperta, quindi mi arriva al 90%. bool KillProcess privato (string name) { foreach (Process clsProcess in Process.GetProcesses()) { se (clsProcess.ProcessName.ToLower(). StartsWith (name.ToLower())) { clsProcess. Uccidere(); return true; } } return false; } Mi chiedo se valga la pena passare il tempo a cercare il gancio di Windows (di cui non so nulla) per la comodità del blocco istantaneo delle app. – Spidey

+0

ok, quel codice non è stato formattato correttamente. – Spidey

1

Un gancio di Windows dovrebbe risolvere il tuo problema. Non ho mai provato questo ... ma dovrete fare un pò di pinvoke su Win32 API per raggiungere questo obiettivo. Google Win32 aggancia e guarda.

0

invece di aspettare che l'eseguibile si apra, in modo da poterlo chiudere di nuovo, è possibile anche azzoppare l'eseguibile.

basta cambiare alcuni byte nell'intestazione di exe e impedirgli così dall'inizio.

Basta fare in modo che l'effetto sia reversibile.

0
private bool KillProcess(string name) 
    { 
     foreach (Process clsProcess in Process.GetProcesses()) 
     { 
      if (clsProcess.ProcessName.ToLower().StartsWith(name.ToLower())) 
      { 
       clsProcess.Kill(); 
       return true; 
      } 
     } 
     return false; 
    } 

sì questo è il metodo che sto usando finora. Questo chiuderà l'app dopo che è stata aperta, quindi mi arriva al 90%. Io uso un timer che controlla ogni 10 secondi. Mi sto solo chiedendo se valga la pena passare il tempo a cercare l'hook di Windows (di cui non so nulla) per la comodità del blocco istantaneo delle app. Quelli di voi che conoscono l'API Win32, ne vale la pena?

0
internal static class Program 
{ 
    private static Mutex m; 

    [STAThread] 
    private static void Main() 
    { 
     bool flag; 
     m = new Mutex(true, "ProgramName", out flag); 
     if (!flag) 
     { 
      MessageBox.Show("Another instance is already running."); 
     } 
     else 
     { 
      //start program 
     } 
    } 
} 

Sto usando questo in un programma, e funziona perfettamente, e dovrebbe essere in grado di cambiare questo per le vostre esigenze.

+0

Il mio codice fa effettivamente la stessa cosa. cioèTrova un processo e affrontalo. – Spidey

+0

sì, ma quelli che valutano TUTTI i processi, con i miei, potresti semplicemente avere un elenco di Mutex e controllarlo. Inoltre, la mia soluzione era per qualcos'altro: impedire all'applicazione PROPRIA di aprire TWICE. Ho semplicemente frainteso la domanda stessa, leggendola troppo velocemente :) – Femaref

0

È possibile scrivere un hook globale.

Ciò che verrà agganciato è meno importante del fatto che sarà globale e, pertanto, implementato in una DLL separata. In quella libreria gestisci correttamente il collegamento a un nuovo modulo. Se rilevi il processo duplicato - uccidilo.

5

Basta una piccola aggiunta alla risposta altrimenti eccellente di Stephen Nutt:

Se si desidera che il programma di andare via per sempre, non solo pop-up qualcos'altro al suo posto (calc.exe nell'esempio di Stephen). Specificare la chiave: "Debugger" = "ntsd -cq"

Questo invocherà NT è sempre presente a linea di comando del debugger NTSD per il programma con la linea di comando argomento -c dicendo "eseguire il comando del debugger specificato successivo "; il comando debugger è q (che significa uscire). Questo fermerà il debugger, che come effetto collaterale ucciderà il debuggee, il programma che vuoi impedire di eseguire.

Pulito, bello e facile. L'unico effetto collaterale che ho osservato è che a volte una finestra di comando transitoria si apre brevemente con un prompt del debugger solo per scomparire di nuovo in un attimo.

+0

Grazie per quello, mi chiedevo cosa mettere invece del calc.exe. – Spidey

1

OK, ho appena trovato l'app che cercavo in origine.

Si chiama Temptation Blocker ed è available here

Troverà tutti gli eseguibili e consente di selezionare ciò che per bloccare per tuttavia molte ore.

Non è perfetto, vorrei che sarebbe di auto iniziare in modo da non dover avviare manualmente ma a parte questo è abbastanza buono

Problemi correlati