2011-08-29 12 views
7

Sto cercando di ottenere i valori effettivi di variabili di ambiente.
Questo è quello che ho finora:Ottieni i valori reali delle variabili di ambiente su una macchina remota in .NET

che funziona, ma ecco il problema: passa 'windir' come nome ottiene '% SystemRoot%' come valore di. Quello che io realmente desidera è il percorso effettivo , ad esempio "C: \ Windows".

ho provato utilizzando ricorsione per ottenere il valore di 'SystemRoot' ma Nessuna corrispondenza sono stati trovati.

Come posso essere sicuro che i valori reali vengano restituiti?
Thx!

+2

Perché% SystemRoot% non è accettabile? Se lo metti in una finestra di Explorer, vai nella directory di installazione di Windows. Perché% SystemRoot% potrebbe essere D: \ Windows \ in teoria. –

+0

possibile duplicato di [Come espandere le variabili di ambiente in remoto con .NET?] (Http://stackoverflow.com/questions/5031111/how-to-expand-environment-variables-remotely-with-net) – VVS

+0

@ Ramhound: I Sto scrivendo un metodo che ** esegue un comando ** su una macchina remota usando ** Win32_Process.Create **. ** Le variabili di ambiente ** sembrano ** essere riconosciute **, quindi stavo cercando di sostituirle **. Se c'è modo di ** farli riconoscere automaticamente **, questo ** risolverà anche il mio problema **. – David

risposta

-2

uso Environment.GetFolderPath(Environment.SpecialFolder.System)

+2

Il titolo della domanda dice su una macchina remota. – TheCodeKing

0

Non è possibile utilizzare Win32_Environment per questo, ma è possibile utilizzare Registro di sistema 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

Per system path variables (come %SystemRoot%) non c'è modo conveniente.

È necessario cercare questi valori da soli leggendo i valori di registro corrispondenti. Heres' una (non completo) elenco di alcune di queste variabili di sistema:

  • % SystemRoot%:

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

    select windowsdirectory from Win32_OperatingSystem
  • % SystemDrive% può essere determinata esaminando% SystemRoot %

Variabili come % AppData% sono dipendenti dall''utente e si trovano sotto

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

+0

Avrebbe ottenuto% SystemRoot% per me, ma non **% ProgramFiles% ** o altri. Suppongo che sto cercando una versione remota di Environment.GetEnvironmentVariable – David

+1

@David: non esiste una versione remota. Un'alternativa sarebbe quella di eseguire da remoto 'Environment.GetEnvironmentVariable', ad es. avviando un programma sulla macchina remota. – VVS

1

So che è creativo al meglio ma questa sembra essere la soluzione più semplice:
Troppo sovraccarico forse?

 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

'Forse troppo in alto?" Niente affatto. Soprattutto quando si contrappone il sovraccarico di inseguire le scia di conigli cercando di risolvere le variabili ricorsive: '% ComSpec% =% SystemRoot% \ System32 \ cmd.exe'. Che incubo. Stavo per arrendermi quando ho visto la tua risposta. Bel trucco – InteXX

Problemi correlati