Получить буквальный путь системной переменной - PullRequest
0 голосов
/ 17 марта 2020

Есть ли способ получить переменную окружения пути в виде литеральной строки вместо развернутого?

т.е.

%systemroot%\System32;%systemroot%\;etc...

вместо

C:\Windows\System32;C:\Windows\;etc...

Я пытался использовать

Environment.GetSystemVariable("Path");

Но это дает мне расширенные каталоги, и я не вижу ничего другого в среде, которое могло бы мне это дать.

Редактировать:

PathUnExpandEnvStrings работает, только если весь путь является переменной среды.

т.е.

C:\Windows\System32;C:\Windows;etc...

становится

C:\Windows\System32;%systemroot%;etc...

с использованием

Registry.GetValue(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "Path", null);

Все еще получает значения как C:\Windows\System32;C:\Windows;etc...

1 Ответ

1 голос
/ 17 марта 2020

Если вы go маршрут реестра, вы можете передать RegistryValueOptions.DoNotExpandEnvironmentNames в RegistryKey.GetValue() метод экземпляра , чтобы получить нерасширенный путь ...

using System;
using Microsoft.Win32;

namespace SO60725684
{
    class Program
    {
        static void Main()
        {
            const string environmentKeyPath = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment";
            const string valueName = "TEMP";

            using (RegistryKey environmentKey = Registry.LocalMachine.OpenSubKey(environmentKeyPath))
            {
                foreach (RegistryValueOptions options in Enum.GetValues(typeof(RegistryValueOptions)))
                {
                    object valueData = environmentKey.GetValue(valueName, "<default>", options);

                    Console.WriteLine($"{valueName} ({options}) = \"{valueData}\"");
                }
            }
        }
    }
}

Это печатает ...

Temp (None) = "C:\WINDOWS\TEMP"
Temp (DoNotExpandEnvironmentNames) = "%SystemRoot%\TEMP"

Я использую переменную "TEMP" только для краткости ее значения, но она работает так же хорошо для "Path".

Если вы не хотите полагаться на резервное хранилище переменной среды, существует также Win32_Environment класс управления , который предоставляет значение без расширения ...

using System;
using System.Management;

namespace SO60725684
{
    class Program
    {
        static void Main()
        {
            string[] propertiesToDisplay = new string[] { "Name", "SystemVariable", "UserName", "VariableValue" };
            ObjectQuery query = new SelectQuery("Win32_Environment", "Name = 'TEMP'", propertiesToDisplay);

            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
            using (ManagementObjectCollection resultCollection = searcher.Get())
            {
                foreach (ManagementBaseObject resultInstance in resultCollection)
                {
                    PropertyDataCollection properties = resultInstance.Properties;

                    foreach (string propertyName in propertiesToDisplay)
                    {
                        PropertyData property = properties[propertyName];

                        Console.WriteLine($"{property.Name}: {property.Value}");
                    }
                    Console.WriteLine();
                }
            }
        }
    }
}

Это печатает ...

Name: TEMP
SystemVariable: True
UserName: <SYSTEM>
VariableValue: %SystemRoot%\TEMP

Name: TEMP
SystemVariable: False
UserName: NT AUTHORITY\SYSTEM
VariableValue: %USERPROFILE%\AppData\Local\Temp

Name: TEMP
SystemVariable: False
UserName: ComputerName\UserName
VariableValue: %USERPROFILE%\AppData\Local\Temp

Как видите, вы получите несколько результатов, когда переменная определена для нескольких пользователей, поэтому вам нужно будет выполнить дополнительную фильтрацию для SystemVariable и * 1027. * свойства, чтобы получить тот, который вы хотите.

...