2011-08-29 10 views
7

Estoy tratando de obtener los valores reales de variables de entorno.
Esto es lo que tengo hasta ahora:Obtener los valores reales de las variables de entorno en una máquina remota en .NET

que funciona, pero aquí está el problema: que pasa 'windir' como nombre consigue '% SystemRoot%' como valor. Lo que realmente quiero es la ruta real , es decir, 'C: \ Windows'.

me trataron usando recursividad para obtener el valor de 'SystemRoot' pero No hay coincidencias se encontraron.

¿Cómo puedo hacer para asegurar que los valores reales consiguen devueltos?
¡Gracias!

+2

¿Por qué% SystemRoot% no es aceptable? Si coloca eso en una ventana del explorador, iría al directorio de instalación de Windows. Porque% SystemRoot% podría ser D: \ Windows \ en teoría. –

+0

posible duplicado de (http://stackoverflow.com/questions/5031111/how-to-expand-environment-variables-remotely-with-net) – VVS

+0

@ Ramhound [Cómo ampliar las variables de entorno de forma remota con .NET?]: I Estoy escribiendo un método que ** ejecuta un comando ** en una máquina remota usando ** Win32_Process.Create **. ** Las variables de entorno ** no parecen ** reconocidas **, por lo que estaba buscando ** reemplazarlas yo mismo **. Si hay forma de ** hacer que se reconozcan automáticamente **, eso ** también resolvería mi problema **. – David

Respuesta

-2

uso Environment.GetFolderPath(Environment.SpecialFolder.System)

+2

El título de la pregunta dice en una máquina remota. – TheCodeKing

0

No puede utilizar Win32_Environment para esto, pero se puede utilizar Registro remoto.

RegistryKey environmentKey = RegistryKey.OpenRemoteBaseKey(
     RegistryHive.LocalMachine, "\\server"); 
RegistryKey key = environmentKey.OpenSubKey(
     @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", false); 
string value = (string)key.GetValue("System"); 
2

Para system path variables (como %SystemRoot%) no hay manera conveniente.

usted tiene que mirar para estos valores usted mismo mediante la lectura de los valores de registro correspondientes. Heres' una lista (no completa) de algunas de estas variables del sistema:

  • % SystemRoot%:

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRoot
    o

    select windowsdirectory from Win32_OperatingSystem
  • % SystemDrive% se puede determinar mediante el examen de% SystemRoot %

Variables como % AppData% dependen del usuario y se encuentran en

HKEY_USERS\<user SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\AppData

+0

Eso me daría% SystemRoot%, pero no **% ProgramFiles% ** u otros. Supongo que estoy buscando una versión remota de Environment.GetEnvironmentVariable – David

+1

@David: no hay una versión remota. Una alternativa sería ejecutar de forma remota 'Environment.GetEnvironmentVariable', p. iniciando un programa en la máquina remota. – VVS

1

Sé que es creativo en el mejor de los casos, pero esta parece ser la solución más simple:
¿Demasiada sobrecarga tal vez?

 using (var process = new Process()) 
     { 
      process.StartInfo.FileName = @"C:\PsTools\PsExec.exe"; 
      process.StartInfo.Arguments = @"\\machineName cmd /c echo " + environmentVar; 
      process.StartInfo.UseShellExecute = false; 
      process.StartInfo.CreateNoWindow = true; 
      process.StartInfo.RedirectStandardOutput = true; 
      process.Start(); 
      return process.StandardOutput.ReadToEnd(); 
     } 
+0

'Demasiada sobrecarga tal vez?' No, en absoluto. Especialmente cuando se establece contra la sobrecarga de perseguir rutas de conejo tratando de resolver variables recursivas: '% ComSpec% =% SystemRoot% \ System32 \ cmd.exe'. Qué pesadilla. Estaba a punto de darme por vencida cuando descubrí tu respuesta. Buen truco. – InteXX

Cuestiones relacionadas