2011-08-29 9 views
7

私はの環境変数実際の値を取得しようとしています。
は、これは私がこれまで持っているものです:
NETのリモートマシン上の環境変数の実際の値を取得

動作しますが、ここで問題です

:名前として「WINDIR」を渡すと値として「%にSystemRoot%は」を取得します。私が実際に言うところのです。実際のパスはです。つまり、「C:\ Windows」です。

私はは「SYSTEMROOT」値を取得するために再帰を使用してを試みたが、なしはが見つかった一致します。

実際の値が返されるようにするにはどうすればよいですか?
Thx!

+2

なぜ%SystemRoot%は受け入れられませんか?これをエクスプローラウィンドウに置くと、Windowsのインストールディレクトリに移動します。 %SystemRoot%は理論上D:\ Windows \になる可能性があるためです。 –

+0

[.NETでリモート環境変数を展開する方法は?](http://stackoverflow.com/questions/5031111/how-to-expand-environment-variables-remotely-with-net) – VVS

+0

@ Ramhound:私** Win32_Process.Create **を使ってリモートマシン上で**コマンドを実行する**メソッドを記述しています。 **環境変数は認識されないように見えるので、**私はそれらを自分で置き換えることを考えていました**。 **それらを自動的に認識させる方法がある場合**、それは**私の問題を解決するでしょう**。 – David

答えて

-2

使用Environment.GetFolderPath(Environment.SpecialFolder.System)

+2

質問タイトルはリモートマシン上にあります。 – TheCodeKing

0

あなたはこのためにWin32_Environmentを使用することはできませんが、リモートレジストリを使用することができます。 system path variablesについては

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

は、(のような%SystemRoot%は)何の便利な方法はありません。

対応するレジストリ値を読むことによって、これらの値を自分で探す必要があります。

  • の%SystemRoot%:これらのシステム変数の一部の相続人(完全ではない)リスト

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRoot
    または

    select windowsdirectory from Win32_OperatingSystem
  • に%SystemDrive%は、%SystemRootを調べることによって決定することができ

%AppData%おそらく
あまりにも多くのオーバーヘッド:
は、ユーザーに依存し、私はそれが最高の状態で創造的であることを知っているが、これは最も簡単な解決策であるように思わ

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

+0

それは私にとっては%SystemRoot%を取得しますが、**%ProgramFiles%**などは取得しません。 Environment.GetEnvironmentVariableのリモートバージョンを探しているとします。 – David

+1

@David:リモートバージョンはありません。代わりに、例えばEnvironment.GetEnvironmentVariableをリモートで実行することもできる。リモートマシン上でプログラムを起動します。 – VVS

1

の下にありますか?

 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

'おそらくオーバーヘッドが多すぎますか? 'まったくありません。特に、再帰変数を解決しようとするウサギの道を追いかけるオーバーヘッドに対して設定すると、 '%ComSpec%=%SystemRoot%\ System32 \ cmd.exe'になります。どのような悪夢。私はあなたの答えを見つけたときに、あきらめようとしていました。ニースのトリック。 – InteXX

関連する問題