2010-05-16 8 views
11

Sto lavorando su un sistema Windows a 64 bit e il mio programma applicativo funziona con privilegi elevati. Ho un problema con il seguente semplice pezzo di codice:C# legge dati di registro errati su sistema operativo a 64 bit

myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 
    if (myKey != null) 
    { 
    string[] HKLMvaluenames = myKey.GetValueNames(); 
    } 

Ma per alcune serie ragione HKLMvaluenames è popolata con i valori dalla seguente chiave:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 

C'è un modo per risolvere questo problema?

+1

Il codice deve essere eseguito in modalità a 32 bit, a causa di una dipendenza esterna/non gestita o qualcosa del genere? –

+0

La tua applicazione è compilata come app a 32 bit? Wow64 è il livello di compatibilità a 32 bit per SO Windows a 64 bit. – Oded

+0

@Nick: Non devo correre in 32 bit ma voglio che la mia applicazione sia in grado di funzionare anche su sistemi operativi a 32 bit (questo è molto importante). @Oded: Sì, so cosa è wow64. La mia applicazione è compilata usando VX2010 Express, quindi credo di non poter nemmeno scegliere come compila. Posso controllarlo da qualche parte? – baal80

risposta

17

Questo è in base alla progettazione, i programmi a 32 bit hanno una vista diversa del registro rispetto ai programmi a 64 bit. Vengono reindirizzati alla chiave HKLM \ Software \ Wow6432Node quando tentano di leggere un valore dall'hive HKLM \ Software. Se costruisci il tuo programma C# con Project + Properties, la scheda Build, Platform Target = Any CPU allora verrà eseguito come un programma a 64 bit e non verrà reindirizzato.

I programmi a 32 bit possono annullare il reindirizzamento, ma ciò non è facile con la classe .NET RegistryKey. P/Invocazione di RegOpenKeyEx con l'opzione KEY_WOW64_64KEY richiesta. Ulteriori informazioni sono disponibili in questo Windows SDK article.


EDIT: questo è ora disponibile anche con NET NET 4() metodo specifico RegistryKey.OpenBaseKey. Passa a RegistryView.Registry64 per visualizzare il registro come farebbe un processo a 64 bit.

5

mentre correvo nella stessa edizione o lo stesso obiettivo della ragione di questo problema, ho trovato una soluzione.

Utilizzare questa:

//To set the Base to the right path set RegistryView to DEFAULT, Registry64 or Registry32 regarding the path you need. If you want to go over the x64 root: 

RegistryKey rk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) 
     .OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 

Ora comporterò nel modo desiderato.

Buon divertimento!

Problemi correlati