【问题标题】:Get the real values of environment variables on a remote machine in .NET在 .NET 中获取远程机器上环境变量的真实值
【发布时间】:2011-11-06 00:56:13
【问题描述】:

我正在尝试获取环境变量实际值
这是我目前所拥有的:

string query = string.Format("Select VariableValue From Win32_Environment Where Name = '{0}'", variableName);

using (var searcher = new ManagementObjectSearcher(query))
using (ManagementObject result = searcher.Get().Cast<ManagementObject>().FirstOrDefault())
{
    if (result != null)
    return Convert.ToString(result["VariableValue"]);
}

这可行,但问题是:将 'windir' 作为名称传递 会得到 '%SystemRoot%' 作为值。我真正想要的是实际路径,即'C:\Windows'。

尝试使用递归获取'SystemRoot'的值,但找不到匹配项

如何确保返回真实值
谢谢!

【问题讨论】:

  • 为什么 %SystemRoot% 不可接受?如果你把它放在资源管理器窗口中,你会转到 windows 的安装目录。因为理论上 %SystemRoot% 可能是 D:\Windows\。
  • @Ramhound:我正在使用 Win32_Process.Create 在远程机器上编写一个运行命令的方法。 环境变量似乎没有被识别,所以我想自己替换它们。如果有办法自动识别它们,那也可以解决我的问题

标签: c# .net windows wmi environment-variables


【解决方案1】:

对于system path variables(如%SystemRoot%)没有方便的方法。

您必须自己通过阅读相应的注册表值来查找这些值。以下是其中一些系统变量的(不完整)列表:

  • %SystemRoot%

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRoot
    从 Win32_OperatingSystem 中选择 windows 目录
  • %SystemDrive% 可以通过检查 %SystemRoot%

  • 来确定

%AppData% 等变量取决于用户,可在

下找到
HKEY_USERS\\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\AppData

【讨论】:

  • 我会得到 %SystemRoot%,但不会得到 %ProgramFiles% 或其他人。我想我正在寻找 Environment.GetEnvironmentVariable 的远程版本
  • @David:没有远程版本。另一种方法是远程执行Environment.GetEnvironmentVariable,例如通过在远程机器上启动一个程序。
【解决方案2】:

我知道它充其量是有创意的,但这似乎是最简单的解决方案:
也许开销太大?

        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();
        }

【讨论】:

  • Too much overhead perhaps? 一点也不。尤其是在试图解决递归变量的追踪兔子轨迹的开销时:%ComSpec% = %SystemRoot%\System32\cmd.exe。什么样的恶梦。当我看到你的答案时,我正要放弃。好把戏。
【解决方案3】:

您不能为此使用 Win32_Environment,但可以使用远程注册表。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 问题标题显示在远程机器上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2013-08-10
    • 2013-11-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多