Как удаленно развернуть переменные среды with.NET?

мне нужен способ развернуть переменную среды на удаленной машине.

Предположим, у меня есть путь к папке %appdata%MyAppPlugins или %ProgramFiles%MyCompanyMyAppPlugins и я хочу перечислить файлы в этой папке для целей аудита. Единственная проблема - я хочу сделать это на удаленной машине, к которой у меня есть доступ администратора.

дополнительный вопрос (но не существенный) - как это сделать для данного пользователя на удаленной машине?

4 ответов


можно использовать GetFolderPath. Есть куча различных SpecialFolder значения, которые можно использовать в том числе ProgramFiles и ApplicationData

string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);

тогда вы можете просто объединить его с остальной частью вашего пути

string full_path = Path.Combine(path, "\MyApp\Plugins");

на удаленной машине, похоже, вы можете попробовать что-то вроде этой

ConnectionOptions co = new ConnectionOptions();
// user with sufficient privileges to connect to the cimv2 namespace
co.Username = "administrator"; 
// his password
co.Password = "adminPwd";
ManagementScope scope = new ManagementScope(@"\BOBSMachine\root\cimv2", co);
SelectQuery query = new SelectQuery("Select windowsdirectory from Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject windir in searcher.Get())
   Console.WriteLine("Value = {0}", windir["windowsdirectory"]);

или для списка всех удаленных переменных среды и их значений, из здесь

public static void GetSysInfo(string domain, string machine, string username, string password)
{
    ManagementObjectSearcher query = null;
    ManagementObjectCollection queryCollection = null;

    ConnectionOptions opt = new ConnectionOptions(); 

    opt.Impersonation = ImpersonationLevel.Impersonate; 
    opt.EnablePrivileges = true; 
    opt.Username = username; 
    opt.Password = password; 
    try 
    { 
        ManagementPath p = new ManagementPath("\\" +machine+ "\root\cimv2");   

        ManagementScope msc = new ManagementScope(p, opt); 

        SelectQuery q= new SelectQuery("Win32_Environment");

        query = new ManagementObjectSearcher(msc, q, null); 
        queryCollection = query.Get(); 

        Console.WriteLine(queryCollection.Count);

        foreach (ManagementBaseObject envVar in queryCollection) 
        {
            Console.WriteLine("System environment variable {0} = {1}", 
            envVar["Name"], envVar["VariableValue"]);
        }
    } 
    catch(ManagementException e) 
    { 
        Console.WriteLine(e.Message); 
        Environment.Exit(1); 
    } 
    catch(System.UnauthorizedAccessException e) 
    { 
        Console.WriteLine(e.Message); 
        Environment.Exit(1); 
    } 
}

OP Edit: Также %AppData% можно найти из реестра (это можно сделать удаленно) в HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders и программные файлы в HKLM\Software\Microsoft\Windows\CurrentVersion, под ProgramfilesDir.


вопрос не имеет смысла. Переменные среды не являются переменными для каждой машины. Например, вы можете ожидать %appdata% в пункте


переменные среды-это объединение параметров "puter-wide и per-user". Запущенный процесс мая измените его среду, и когда он порождает другой процесс, этот процесс наследует среду процесса, который его создал.

Если у вас нет доступа к процессу, запущенному на удаленной машине (или вы можете запустить его), нет такой вещи, как "среда": контекст для нее просто не существует. Среда конкретного процесса является функцией из всего перечисленного ниже:

  • среда, унаследованная от среды родительского процесса (которая может выполняться под другой учетной записью пользователя, чем дочерний процесс.)
  • настройки компьютерной среды.
  • любые параметры среды, заданные пользователем.
  • любые изменения, внесенные самим процессом.

при этом Windows сохраняет настройки переменной среды в реестр:

  • переменные пользователя.
    HKEY_CURRENT_USER\Environment
  • системные переменные.
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

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

обратите внимание, что переменные среды могут быть определены в терминах других переменных среды: я считаю, что вы, вероятно, позаботитесь о правильном расширении самостоятельно.


насколько я могу судить, единственный способ разрешения %ProgramFiles% - через реестр, так как это не отображается в Win32_Environment (несмотря на документацию, предлагающую иное). Так что это отлично работает:

$key = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$serverName);
$versionKey = $key.OpenSubKey('SOFTWARE\Microsoft\Windows\CurrentVersion');
$versionKey.GetValue('ProgramFilesDir')

однако я не могу использовать этот подход для возврата папки Program Files (x86) - ключ, который я вижу в реестре, не "показывает" с помощью API реестра. Странный.

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