c # - Få de reelle værdier af miljøvariabler på en fjernmaskine i .NET

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at få faktiske værdier af miljøvariabler .
Dette er hvad jeg har hidtil:


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"]);
}


Det fungerer, men her er problemet: at 'windir' som navn får '\% SystemRoot\%' som værdi . Hvad jeg virkelig vil vil er egentlig vej , dvs. 'C: \ Windows'.


Jeg forsøgte ved hjælp af rekursion for at få værdien af ​​'SystemRoot' , men ingen kampe blev fundet.


Hvordan kan jeg sikre mig, at reelle værdier kommer tilbage?
Thx!

Bedste reference


For systemvejvariabler (som \%SystemRoot\%) er der ingen bekvem måde. [9]


Du skal selv søge disse værdier ved at læse de tilsvarende registreringsværdier. Heres 'en (ikke komplet) liste over nogle af disse systemvariabler:



  • \% SystemRoot\% :
    HKLMSOFTWAREMicrosoftWindows NTCurrentVersionSystemRoot
    eller


    select windowsdirectory from Win32\_OperatingSystem

  • \% SystemDrive\% kan bestemmes ved at undersøge\% SystemRoot\%



Variabler som \% AppData\% er brugerafhængige og findes under
HKEY\_USERS<user SID>SoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell FoldersAppData


Andre referencer 1


Jeg ved det kreativt i bedste fald, men det ser ud til at være den enkleste løsning:
For meget overhead måske?


        using (var process = new Process())
        {
            process.StartInfo.FileName = @"C:PsToolsPsExec.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();
        }

Andre referencer 2


Du kan ikke bruge Win32\_Environment til dette, men du kan bruge fjernregistret.


RegistryKey environmentKey = RegistryKey.OpenRemoteBaseKey(
      RegistryHive.LocalMachine, "\server");
RegistryKey key = environmentKey.OpenSubKey(
      @"SYSTEMCurrentControlSetControlSession ManagerEnvironment", false);
string value = (string)key.GetValue("System");

Andre referencer 3


brug Environment.GetFolderPath(Environment.SpecialFolder.System)