2010-11-28 6 views
0

In Windows, wenn Sie eine Eingabeaufforderung geöffnet (cmd.exe), die Registrierungsschlüssel:Start cmd.exe Problem

HKLM \ Software \ Microsoft \ Command Processor
HKCU \ Software \ Microsoft \ Command Prozessor

werden auf einen Wert überprüft, der als "AutoRun" bezeichnet wird. Wenn diese Datei gefunden wird, wird die im Wert genannte Stapeldatei ausgeführt, die eine autoexec-ähnliche Funktionalität bietet. Wenn beide Schlüssel AutoRun-Werte enthalten, werden beide ausgeführt. Genial!

Ich verwende Process.Start, um cmd.exe auszuführen, und das AutoRun-Verhalten tritt nicht auf. Mein aktueller Code ist:

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. 
    } 
} 

Ich habe auch versucht, es auf die einfachste Form reduziert:

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

Alles, was ich funktioniert perfekt versuchen (in, dass ein Befehlsfenster gestartet wird), aber die AutoRun Verhalten tritt nie auf.

+0

Wo ist der Code, der die Registrierung überprüft? – bitxwise

+0

Es funktioniert, ich habe kein Problem im Code gefunden –

+0

Wenn Sie Ihre "Autorun" nur in den HKLM-Schlüssel, Ihr Problem möglicherweise Virtualisierung gesetzt haben. Hast du etwas in die HKCU gesteckt und nichts bekommen? Haben Sie dies auch manuell getestet, indem Sie die Eingabeaufforderungen gestartet haben, sodass Sie wissen, dass das Problem nur darin besteht, wie Ihr Code sie startet? –

Antwort

2

Ich habe es gefunden. Das Problem bestand darin, wie Windows Daten aus der Registrierung in 64-Bit-Versionen des Betriebssystems speichert (und abruft). Mein Code war in Ordnung. Die article on MSDN geht ins Detail. Von diesem Artikel:

Auf 64-Bit-Windows, Teile der Registrierungseinträge werden separat für 32-Bit-Anwendung und 64-Bit- Anwendungen und kartiert in separate logische Registrierungs Ansichten mit dem Registry Redirector gespeichert und Registrierung Reflexion, da die 64-Bit-Version einer Anwendung möglicherweise andere Registrierungsschlüssel und Werte als die 32-Bit-Version verwenden. Es gibt auch gemeinsame Registrierungsschlüssel, die nicht umgeleitet oder reflektiert werden.

Die Lösung für mich war meine AutoRun Schlüssel unter hinzuzufügen:

HKLM\Software\Wow6432Node\Microsoft\Command Processor 

Was wirklich bekommt meine Ziege ist, dass ich, bevor sie in diese laufen. Ich täusche mich so selten mit der Registrierung, ich hätte es einfach komplett vergessen.