9

Para habilitar Microsoft-Hyper-V y Microsoft-Hyper-V-Management en Windows 2008 R2 Server (64 bits), invoco dism.exe como un proceso. El comando que he usado esLlamar a dism.exe desde System.Diagnostics.Process falla

Dism.exe/línea/Get-FeatureInfo /FeatureName: Microsoft Hyper-V

Dism.exe/línea/Get-FeatureInfo /FeatureName: Microsoft- Clientes de administración de Hyper-V

Esto funciona bien cuando ejecuto esto desde la línea de comandos pero falla cuando intento ejecutarlo a través de mi código. Probé la versión de 64 bits de Dism.exe en la carpeta C: \ Windows \ SysWoW64 pero también falla. Aquí está el mensaje de error que consigo,

No se puede dar servicio a un sistema de operativo de 64 bits que se ejecuta con una versión de 32 bits de DISM. Utilice la versión de DISM que corresponde a la arquitectura de su computadora .

¿Qué es lo que falta aquí?

ACTUALIZACIÓN: SLaks tenía razón, pero el problema fue que MS Visual Studio Express Edition por defecto se dirige a x86, que tuve que editar manualmente en el archivo .csproj a AnyCPU para que funcione.

+1

'SysWoW64' contiene stubs de 32 bits, no ejecutables de 64 bits. – SLaks

Respuesta

24

Debido a que se está ejecutando en un proceso de 32 bits, que está getting redirected to the 32-bit version in SysWoW64

Run %WINDIR%\SysNative\dism.exe para evitar la redirección.

+0

Lo intenté, pero todavía estoy enfrentando el mismo problema, ¡pero sin suerte! Aquí hay dos líneas del registro, _DISM.EXE: Ejecutando la línea de comando: C: \ Windows \ SysWow64 \ dism.exe/en línea/Get-FeatureInfo/FeatureName: Microsoft-Hyper-V_ _DISM Provider Store: PID = 892 Cargando el proveedor desde la ubicación C: \ Windows \ System32 \ Dism \ FolderProvider.dll - CDISMProviderStore :: Internal_GetProvider_ Aunque me he centrado en la versión de 64 bits, todavía está buscando las bibliotecas de dismen de los procesos de 32 bits –

+1

Esto no parece funcionar para mí. En mi servidor (mismo sistema operativo, también de 64 bits) no hay ninguna carpeta C: \ Windows \ SysNative ... –

+1

La carpeta C: \ Windows \ SysNative solo es visible para los procesos de 32 bits. – dabide

4

Crear a continuación el contenido en un archivo por lotes, por ejemplo RunDism.bat

%WINDIR%\SysNative\dism.exe 

llamar al archivo por lotes en su programa. SysNative no es una carpeta real, por lo que no puede llamar al código anterior en su programa directamente, debe llamar por sistema. De esta manera me funciona.

+0

Desarrollo en Mac ahora, así que no puedo verificar esto, pero puede ser útil para alguien más que se enfrenta a este problema. Gracias –

2

Lo que necesita es llamar al dism.exe apropiado dependiendo de la arquitectura del sistema.

Como dijo @eric xu, debe resolver la ruta porque no es una ruta real. A continuación está el código que funciona para mí. Básicamente detecta la arquitectura del sistema, resuelve la ruta en función de la arquitectura y luego llama al dism.exe apropiado.

string system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "system32", "dism.exe"); 
if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess) 
{ 
    // For 32-bit processes on 64-bit systems, %windir%\system32 folder 
    // can only be accessed by specifying %windir%\sysnative folder. 
    system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "sysnative", "dism.exe"); 
} 

Fuente: File System Redirector

0

tuve que usar "SysNative \ DISM.exe" Si añadí% windir% \ fallaría, estoy usando VS2017 instalación en el servidor 2012R2. Tnhx!