2010-11-28 34 views
0

Dans Windows, lorsqu'une invite de commande est ouverte (cmd.exe), les clés de Registre:problème de démarrage cmd.exe

HKLM \ Software \ Microsoft \ Command Processor
HKCU \ Software \ Microsoft \ Command Le processeur

sont vérifiés pour une valeur appelée "AutoRun". S'il est trouvé, le fichier batch nommé dans la valeur est exécuté, fournissant une fonctionnalité autoexec. Si les deux clés contiennent des valeurs AutoRun, les deux seront exécutées. Impressionnant! J'utilise Process.Start pour exécuter cmd.exe et le comportement AutoRun ne se produit pas. Mon code actuel est:

private openShell(string folder) 
{ 
    ProcessStartInfo startInfo = new ProcessStartInfo() 
     { 
      FileName = Environment.GetEnvironmentVariable("COMSPEC") ?? "cmd.exe", 
      Arguments = "/k cd \"" + folder + "\"", 
      UseShellExecute = true 
     }; 

    try 
    { 
     using (var exeProcess = System.Diagnostics.Process.Start(startInfo)) 
     { 
      exeProcess.WaitForExit(); 
     } 
    } 
    catch 
    { 
     // Log error. 
    } 
} 

J'ai aussi essayé la réduire jusqu'à la forme la plus simple:

System.Diagnostics.Process.Start("cmd.exe"); 

Tout ce que j'essaie fonctionne parfaitement (dans ce lancement une fenêtre de commande), mais le AutoRun le comportement ne se produit jamais.

+0

Où est le code qui vérifie le registre? – bitxwise

+0

Cela fonctionne, je n'ai pas trouvé de problème dans le code –

+0

si vous avez mis votre "autorun" seulement dans la clé HKLM, votre problème peut être la virtualisation. Avez-vous mis quelque chose dans le HKCU et n'obtenez rien? En outre, avez-vous testé cela en lançant des invites de commande à main levée pour que vous sachiez que le seul problème est de savoir comment votre code les lance? –

Répondre

2

Je l'ai trouvé. Le problème était dans la façon dont Windows stocke (et récupère) les données du registre dans les versions 64 bits du système d'exploitation. Mon code était bien. Le article on MSDN va dans certains détails. De cet article:

Sur Windows 64 bits, des parties des entrées de registre sont stockés séparément pour application 32 bits et 64 bits applications et mises en correspondance séparées vues de registre logique à l'aide du redirecteur de Registre et le registre réflexion, parce que la version 64 bits d'une application peut utiliser différentes clés et valeurs de registre que la version 32 bits . Il existe également des clés de registre partagées qui ne sont pas redirigées ou reflétées.

La solution pour moi était d'ajouter ma clé AutoRun sous:

HKLM\Software\Wow6432Node\Microsoft\Command Processor 

Ce qui est vraiment ma chèvre est que j'ai rencontré auparavant. J'ai si rarement batifolé avec le registre, je l'avais complètement oublié.