Получить реальные значения переменных среды на удаленной машине в .NET - PullRequest
7 голосов
/ 29 августа 2011

Я пытаюсь получить фактические значения из переменных среды .Это то, что у меня есть:

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'.

I пробовал с использованием рекурсия чтобы получить значение 'SystemRoot' , но совпадений не найдено .

Как я могу убедиться, что реальные значения будут возвращены?Thx!

Ответы [ 4 ]

2 голосов
/ 29 августа 2011

Для системных переменных пути (например, %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
1 голос
/ 30 августа 2011

Я знаю, что это в лучшем случае креативно, но это, кажется, самое простое решение:Возможно, слишком много накладных расходов?

        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 голосов
/ 29 августа 2011

Для этого нельзя использовать 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");
0 голосов
/ 29 августа 2011

использование Environment.GetFolderPath(Environment.SpecialFolder.System)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...