2012-04-11 53 views
14

Tengo que copiar una utilidad psTool a la carpeta System32 cuando se ejecuta mi aplicación.
Estoy en 64 bits de Windows 7 y cada vez que intento copiar el archivo exe a la carpeta de bits de system32 a través de File.Copy, el exe siempre se copia en SysWow64.Archivo copiado en SysWOW64 en lugar de System32

Cuando pongo un punto de interrupción en destFile, la ruta se muestra como C:\Windows\System32 pero el archivo no entra allí (va a sysWow64). He intentado el Special FolderSystemX86, pero el archivo vuelve a sysWOW64.

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

¿Alguna sugerencia que me hace falta aquí?

EDITAR

Como se señala más adelante en la respuesta, hay redirección del sistema de archivos que tienen lugar. Estoy desarrollando la aplicación con la configuración predeterminada de Visual Studio para una aplicación de consola en un sistema operativo de 64 bits. No estoy seguro de qué configuraciones/interruptores se deben mantener durante la compilación, para que la aplicación funcione tanto en sistemas operativos de 32 bits como de 64 bits.
Básicamente, solo debe establecer copiar el archivo en System32 solo independientemente del bit OS que sea.
Más adelante en el programa, tengo que acceder a la utilidad psTools a través de la línea de comandos que no está disponible si la ubico en SysWOW64. Si hago un cambio, para usar el cmd.exe de 32 bits de SysWOW64, esto sería nuevamente algo específico de la plataforma de 64 bits, que no quiero optar.

Cualquier solución que pueda tener la aplicación ejecutándose tanto en 32 bits como en 64 bits sin problemas? ¿Tengo que modificar el código (¿cómo?) O tengo que modificar algunas propiedades de este proyecto de aplicación de consola (¿qué propiedades)?

+1

En primer lugar, ¿para qué lo está copiando de system32, qué herramienta del conjunto de PsTools está tratando de ejecutar? –

+0

Cópielo en 'system32', no copiándolo de. 'pskill' es el nombre de la utilidad. – user1240679

+1

Me tienes en el to/from typo. Sin embargo, todavía no ha respondido la pregunta ** por qué ** está copiando 'pskill' en la carpeta' system32' en lugar de simplemente ejecutarlo desde otro lugar (y agregarlo a la variable 'PATH' del sistema si es necesario) –

Respuesta

22

Ha tenido problemas con file system redirection.

Debido %windir%\System32 está reservado exclusivamente para aplicaciones de 64 bits, en versiones de 64 bits de Windows, aplicaciones de 32 bits que intentan acceder al directorio %windir%\System32 son de forma automática y transparente redirigido al directorio de 32 bits %windir%\SysWOW64.

Primero, asegúrese de que su programa realmente pertenece a la carpeta del sistema de 64 bits. Windows hace esta redirección automática por una razón. cosas de 32 bits no van en la carpeta %windir%\System32 en las versiones de 64 bits de Windows.

Si está seguro de que desea copiar cosas en el directorio del sistema de 64 bits, tiene un par de opciones. Probablemente lo más fácil sea simplemente compilar su utilidad como una aplicación de 64 bits. Alternativamente, puede decirle al redireccionador WOW64 que sabe lo que está haciendo y no realizar la redirección utilizando %windir%\Sysnative en lugar de %windir%\System32.

+0

No estoy seguro de cómo hacer lo anterior 'Sysnative' en el código anterior. Intenté abrir el diálogo 'ejecutar' para abrir'% windir% \ Sysnative', pero esto no abre ningún directorio. – user1240679

+1

@user: debe acceder al directorio desde una ** aplicación de 32 bits **. No hace falta decir que Windows Explorer no es una aplicación de 32 bits en las versiones de 64 bits de Windows. Tal vez [estas instrucciones] (http://ovidiupl.wordpress.com/2008/07/11/useful-wow64-file-system-trick/) sería útil? –

+0

Entiendo que esta redirección se realiza cuando una aplicación de 32 bits intenta acceder a System32 en 64 bits. Sin embargo, no hice nada durante el desarrollo que debería haber hecho mi aplicación de 32 bits. El objetivo de la plataforma también está configurado en 'Cualquier CPU'. ¿No se comporta la aplicación como de 32 bits en el sistema operativo de 32 bits y de 64 bits en el sistema operativo de 64 bits, lo que debería haber resuelto el problema al acceder a la carpeta 'System32' solamente en absoluto. Sin embargo, es muy extraño el nombre de 'System32' para aplicaciones de 64 bits en sistemas operativos de 64 bits. Todavía no puedo discernir qué específico tengo que cambiar en mi aplicación. : -/ – user1240679

1

Como variable de ruta Environnement contiene c:\windows en ambas versiones de Windows x86/x64, por qué no poner su herramienta en c:\windows: %windir%?

En mi caso, esto resuelve mi problema.

5

Tuve el mismo problema. Las soluciones consisten en establecer el "objetivo de la plataforma" como x64 o AnyCPU en lugar de x86 en las propiedades del proyecto en Visual Studio.En este caso, la ruta será "C:\Windows\system32" y no se redireccionará a "C:\Windows\SysWOW64". Puede verificar esto colocando cualquier archivo en la carpeta "C: \ Windows \ SysWOW64" y luego usar el comando File.Exists para verificar si el archivo se encuentra en esa carpeta:

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

O

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

enter image description here

2

que utilizar una propiedad ayudante en mis aplicaciones de 32 bits que siempre devuelven la carpeta system32 nativa. La propiedad auxiliar es:

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); 
    } 
} 
Cuestiones relacionadas