2012-04-11 2 views
14

Je dois copier un utilitaire psTool dans le dossier System32 lorsque mon application s'exécute.
Je suis sur Windows 7 64 bits et à chaque fois, j'essaie de copier le fichier exe vers le dossier system32 bits à travers File.Copy, l'exe est toujours copié à SysWow64 à la place.Copie de fichier dans SysWOW64 au lieu de System32

Lorsque je mets un point d'arrêt sur le fichier destFile, le chemin est affiché comme C:\Windows\System32 mais le fichier n'y va pas (va à sysWow64). J'ai essayé le Special FolderSystemX86, mais le fichier va à nouveau à sysWOW64.

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

Des suggestions que je manque ici?

EDIT

Comme il est indiqué ci-dessous dans la réponse, il y a la redirection du système de fichiers en cours. Je développe l'application avec les paramètres par défaut de Visual Studio pour une application console sur un système d'exploitation 64 bits. Je ne suis pas sûr quels paramètres/commutateurs doivent être conservés lors de la compilation, de sorte que l'application fonctionne à la fois sur les systèmes d'exploitation 32 bits et 64 bits.
Fondamentalement, il devrait simplement définir copier le fichier à System32 seulement quel que soit ce bit OS il est.
Plus tard dans le programme, je dois accéder à l'utilitaire psTools via une ligne de commande qui n'est pas disponible si je le place dans SysWOW64. Si je fais le changement, pour utiliser 32 bits cmd.exe de SysWOW64, ce serait encore quelque chose de 64 bits spécifiques à la plate-forme, que je ne veux pas opter.

Une solution qui peut faire fonctionner l'application à la fois sur 32 bits et 64 bits sans problème? Dois-je modifier le code (comment?) Ou dois-je modifier certaines propriétés de ce projet d'application console (quelles propriétés)?

+1

Pourquoi le copiez-vous à partir de system32 en premier lieu, quel outil de la suite PsTools essayez-vous d'exécuter? –

+0

Copiez-le dans 'system32', sans le copier depuis. 'pskill' est le nom de l'utilitaire. – user1240679

+1

Vous m'avez eu sur le/de la faute de frappe. Cependant, vous n'avez toujours pas répondu à la question ** pourquoi ** vous copiez 'pskill' dans le dossier' system32' au lieu de simplement le lancer depuis un autre endroit (et ajoutez-le à la variable système 'PATH' si nécessaire –

Répondre

22

Vous avez exécuté file system redirection.

Parce que %windir%\System32 est réservé exclusivement pour les applications 64 bits, sur les versions 64 bits de Windows, les applications 32 bits qui tentent d'accéder au répertoire %windir%\System32 sont automatiquement et transparent redirigé vers le répertoire 32 bits %windir%\SysWOW64. Tout d'abord, assurez-vous que votre programme fait partie du dossier système 64 bits. Windows effectue cette redirection automatique pour une raison. Les éléments 32 bits ne vont pas dans le dossier %windir%\System32 sur les versions 64 bits de Windows.

Si vous êtes certain de vouloir copier des données dans le répertoire système 64 bits, vous disposez de plusieurs options. Le plus simple est probablement de simplement compiler votre utilitaire en tant qu'application 64 bits. Vous pouvez également indiquer au redirecteur WOW64 que vous savez ce que vous faites et ne pas effectuer la redirection en utilisant %windir%\Sysnative au lieu de %windir%\System32.

+0

Je ne sais pas comment faire la chose 'Sysnative' ci-dessus dans le code ci-dessus. J'ai essayé à travers la boîte de dialogue 'run' pour ouvrir'% windir% \ Sysnative', mais cela n'ouvre aucun répertoire. – user1240679

+1

@user: Vous devez accéder au répertoire à partir d'une ** application 32 bits **. Il va sans dire que Windows Explorer n'est pas une application 32 bits sur les versions 64 bits de Windows. Peut-être que [ces instructions] (http://ovidiupl.wordpress.com/2008/07/11/useful-wow64-file-system-trick/) seraient utiles? –

+0

Je comprends que cette redirection est effectuée lorsqu'une application 32 bits tente d'accéder à System32 sur 64 bits. Cependant, je n'ai rien fait pendant le développement qui aurait dû faire ma demande 32 bits. La cible de la plateforme est également définie sur 'Any CPU'. L'application ne se comporte-t-elle pas en 32 bits sur un système d'exploitation 32 bits et 64 bits sur un système d'exploitation 64 bits, ce qui aurait dû résoudre le problème en accédant uniquement au dossier 'System32'. Très étrange à propos de nommer 'System32' pour les applications 64 bits sur le système d'exploitation 64 bits bien. Je ne suis toujours pas capable de discerner ce que je dois changer dans ma demande. : -/ – user1240679

1

Comme variable environnement de chemin contient c:\windows sur Windows x86/x64 versions, pourquoi ne pas mettre votre outil dans c:\windows: %windir%?

Dans mon cas cela résout mon problème.

5

J'ai eu le même problème. Les solutions consistent à définir la "cible de la plate-forme" comme x64 ou AnyCPU au lieu de x86 dans les propriétés de projet dans Visual Studio.Dans ce cas, le chemin sera "C:\Windows\system32" et ne redirigera pas vers "C:\Windows\SysWOW64" Vous pouvez vérifier cela en plaçant n'importe quel fichier dans le dossier "C: \ Windows \ SysWOW64" et ensuite utiliser la commande File.Exists pour vérifier si le fichier se trouve dans ce dossier:

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

Ou

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

enter image description here

2

J'utilise une propriété d'aide dans mes applications 32 bits qui reviennent toujours le dossier natif system32. La propriété d'assistance est:

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); 
    } 
} 
Questions connexes