Buenas
Si quieres iniciar una aplicación antes del inicio de la Shell (o la interfáz del Explorer), bajo Windows XP, Vista, 7, u 8 (aunque no lo he probado con todos), simplemente puedes modificar el valor
userinit de la siguiente clave de registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon, que es un valor delimitado por comas, para añadir la ruta absoluta a tu aplicación, por ejemplo:
C:\Windows\System32\notepad.exe,C:\Windows\System32\userinit.exe
Sobre el tiempo de inicialización de tu aplicación desarrollada en C# (que dices que tarda bastante),
generalizando y por la naturaleza del JIT (Just-in-time compilation) un ensamblado .Net tarda bastante en inicializarse completamente (en comparación con otros binarios de otros lenguajes),
pero si quieres optimizar el tiempo transcurrido entre que se inicializa la aplicación y se muestra el Form principal, es decir, el
boot-time (o
Startup), entonces puedes utilizar el servicio
NGEN (Native Image Generator), que reduce considerablemente el
boot-time de cualquier ensamblado .Net debido a que, a diferencia del JIT, el ensamblado ya ha sido compilado a código de máquina (machine code) antes de iniciar la aplicación (el JIT siempre lo compila a código de máquina durante el Startup de la aplicación), pero por contra, al utilizar NGEN reducirás el rendimiento general de la aplicación, su tiempo de respuesta, aunque no llegarás a apreciar esa disminuición de rendimiento a menos que tu aplicación sea muy "pesada", aunque también podemos decir lo mismo sobre notar el tiempo transcurrido del startup entre NGEN <> JIT xD.
Ambos tienen sus beneficios y sus contras, tu decides que prefieres, el JIT para un startup lento con un rendimiento normal de la aplicación, o NGEN para un startup rápido con un rendimiento lento de la aplicación.
Otro tema es que tambien me gustaria que una vez arrancado el programa un usuario con mas privilegios ( jefe, tecnico...) pueda acceder al escritorio minimizando el programa. La programacion de eso lo tengo hecho pero me imagino que dentro de mi programa deberia arrancar primero el explorer.exe .
Y, digo yo, ¿por qué ese empeño en dejar sin patas a una mesa?, quiero decir, el escritorio es una parte importante de Windows, ¿que necesidad encuentras para querer ocultar el entorno del escritorio mientras el end-user utiliza tu app?.
De todas formas, es suficiente con matar e iniciar el proceso cuando lo creas conveniente, puedes recurrir a la utilización de la Class
System.Diagnostics.Process para llevar a cabo ambas tareas.
Si tienes alguna duda sobre estos temas relacionado con C#, publícala en el subforo dedicado a la programación .Net y allí te ayudaré(mos).
PD: Cuando formules una pregunta sobre Windows, cómo mínimo especifica que versión utilizas, no somos magos.
Saludos!