If it is made with a bytecode language like .net (VB.net, C#) or Java, a specific decompiler can be used. For .net programs you could use

.
The same applies for scripts that are somehow just "packed" into an .exe with a appropriate interpreter (e.g. AutoIt).
However, if the program was compiled "natively", the simple answer is: you can't exactly "extract" or "decompile" it to source code. There are approaches to "backinterpret" the assembly as C code, but it's not that reliable as far as I know and it's definitly not the original source code. Furthermore it lacks information which are lost during compilation (all variable / function names, correct struct / class layouts, etc.). If you want to get reliable high quality code from that, the only way is to reverse it manually from assembly.
With best regards
Jeoni