Я не знаю, в частности, о C #, но одна из причин, по которой вы могли бы сделать это (я буду опасным способом), заключается в использовании параметров выполнения файла изображения (http://blogs.msdn.com/junfeng/archive/2004/04/28/121871.aspx) в реестре). Для любого исполняемого файла, который вы хотите перехватить, вы можете установить для него параметр Debugger, а затем создать небольшое приложение, которое будет использоваться в отладчике, а затем по существу отфильтровать эти вызовы. Если вы хотите разрешить его запуск, запустите процесс. в противном случае делай, что хочешь. Я никогда не пытался сделать это, но, похоже, он мог делать то, что ты хочешь.
Или, если вы хотите отреагировать на запуск процесса и затем закрыть его, вы можете использовать ProcessWatcher (http://weblogs.asp.net/whaggard/archive/2006/02/11/438006.aspx)) и подписаться на событие, созданное процессом, а затем закрыть его, если необходимо. Однако это более реактивный подход вместо того, чтобы упреждающий подход, как первый.