2012-04-11 15 views
14

Devo copiare un'utilità psTool nella cartella System32 quando viene eseguita la mia applicazione.
Sono su Windows 7 a 64 bit e ogni volta, provo a copiare l'exe nella cartella system32 tramite File.Copy, l'exe viene sempre copiato su SysWow64.File copiato su SysWOW64 anziché System32

Quando si inserisce un punto di interruzione su destFile, il percorso viene visualizzato come C:\Windows\System32 ma il file non viene inserito (va a sysWow64). Ho provato il Special FolderSystemX86, ma il file va di nuovo a sysWOW64.

string sourceFile = "C:\bin\Debug\somexe.exe" 
string destFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), utilityName); 
File.Copy(sourceFile, destFile, true); 

Qualche suggerimento quello che mi manca qui?

EDIT

Come sottolineato seguito nella risposta, non c'è sistema di file di reindirizzamento in atto. Sto sviluppando l'app con le impostazioni predefinite di Visual Studio per un'applicazione console su un sistema operativo a 64 bit. Non sono sicuro di quali impostazioni/interruttori debbano essere conservati durante la compilazione, in modo che l'applicazione funzioni sia su sistemi operativi a 32 bit che a 64 bit.
In pratica, è sufficiente impostare il file su System32, indipendentemente dal sistema operativo a cui è collegato.
Più tardi nel programma, devo accedere all'utilità psTools tramite la riga di comando che non è disponibile se lo metto in SysWOW64. Se apporto le modifiche, per utilizzare il cmd.exe di SysWOW64 a 32 bit, questo sarebbe di nuovo qualcosa di specifico della piattaforma a 64 bit, che non voglio optare.

Qualsiasi soluzione che può avere l'applicazione sia in esecuzione su 32-bit e 64 bit senza problemi? Devo modificare il codice (come?) O devo modificare alcune proprietà di questo progetto di applicazione della console (quali proprietà)?

+1

Perché si sta copiando da system32 in primo luogo, quale strumento della suite PsTools stai cercando di eseguire? –

+0

Copia su 'system32', non copiarlo da. 'pskill' è il nome dell'utilità. – user1240679

+1

Mi hai preso da a/da errore di battitura. Tuttavia, non hai ancora risposto alla domanda ** perché ** stai copiando 'pskill' nella cartella' system32' invece di eseguirla semplicemente da qualche altra parte (e aggiungerla alla variabile di sistema 'PATH' se necessario –

risposta

22

Hai eseguito il controllo di file system redirection.

Perché %windir%\System32 è riservata esclusivamente per le applicazioni a 64 bit, nelle versioni a 64 bit di Windows, applicazioni a 32 bit che tentano di accedere alla directory %windir%\System32 sono automaticamente e trasparente reindirizzato alla directory a 32 bit %windir%\SysWOW64.

Innanzitutto, assicurarsi che il proprio programma appartenga effettivamente alla cartella di sistema a 64 bit. Windows esegue questo reindirizzamento automatico per un motivo. La roba a 32 bit non viene inserita nella cartella %windir%\System32 nelle versioni a 64 bit di Windows.

Se sei sicuro di voler copiare cose nella directory di sistema a 64 bit, hai un paio di opzioni. Il più semplice è probabilmente solo compilare la tua utilità come un'applicazione a 64 bit. In alternativa, puoi dire al redirector WOW64 che sai cosa stai facendo e non eseguire il reindirizzamento usando %windir%\Sysnative anziché %windir%\System32.

+0

Non sono sicuro di come fare la precedente cosa 'Sysnative' nel codice sopra. Ho provato con la finestra di dialogo 'run' per aprire'% windir% \ Sysnative', ma questo non apre nessuna directory. – user1240679

+1

@user: è necessario accedere alla directory da un'applicazione ** a 32 bit **. Va da sé che Windows Explorer non è un'applicazione a 32 bit su versioni a 64 bit di Windows. Forse [queste istruzioni] (http://ovidiupl.wordpress.com/2008/07/11/useful-wow64-file-system-trick/) sarebbero utili? –

+0

Capisco che questo reindirizzamento viene eseguito quando un'applicazione a 32 bit tenta di accedere a System32 su 64 bit. Tuttavia, non ho fatto nulla durante lo sviluppo che avrebbe dovuto rendere la mia applicazione a 32 bit. Anche la piattaforma target è impostata su 'Any CPU'. L'applicazione non si comporta come 32-bit su sistemi operativi a 32 bit e 64 bit su sistemi operativi a 64 bit, il che dovrebbe risolvere il problema accedendo esclusivamente alla cartella 'System32'. Molto strano riguardo alla denominazione di 'System32' per le applicazioni a 64 bit su sistemi operativi a 64 bit. Non riesco ancora a distinguere ciò che specifico devo cambiare nella mia applicazione. : -/ – user1240679

1

Come variabile del percorso environnement contiene c:\windows su entrambe le versioni di Windows x86/x64, perché non mettere il vostro strumento in c:\windows: %windir%?

Nel mio caso questo risolve il mio problema.

5

Ho avuto lo stesso problema. La soluzione è impostare "Target piattaforma" come x64 o AnyCPU anziché x86 nelle proprietà del progetto in Visual Studio.In questo caso il percorso sarà "C:\Windows\system32" e non verrà reindirizzato a "C:\Windows\SysWOW64" È possibile verificarlo inserendo qualsiasi file nella cartella "C: \ Windows \ SysWOW64" e quindi utilizzare il comando File.Exists per verificare se il file è stato trovato in quella cartella:

File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), sFileName)); 

O

File.Exists(Path.Combine(Environment.SystemDirectory, sFileName)); 

enter image description here

2

io uso una proprietà aiutante nelle mie applicazioni a 32 bit che restituisce sempre la cartella system32 nativo. La proprietà helper è:

public static string NativeSystemPath 
{ 
    get 
    { 
     if (Environment.Is64BitOperatingSystem) 
     { 
      return System.IO.Path.Combine(
       Environment.GetFolderPath(Environment.SpecialFolder.Windows), 
       "Sysnative"); 
     } 
     return Environment.GetFolderPath(Environment.SpecialFolder.System); 
    } 
} 
Problemi correlati