Как удаленно расширить переменные среды с помощью .NET? - PullRequest
10 голосов
/ 17 февраля 2011

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

Предположим, у меня есть путь к папке %appdata%\MyApp\Plugins или %ProgramFiles%\MyCompany\MyApp\Plugins, и я хочу перечислить файлы в этой папке для целей аудита.Единственная проблема заключается в том, что я хочу сделать это на удаленной машине, к которой у меня, однако, есть доступ администратора.

Дополнительный вопрос (но не обязательный) заключается в том, как это сделать для данного пользователя на удаленной машине?*

Ответы [ 4 ]

8 голосов
/ 17 февраля 2011

Вы бы использовали GetFolderPath . Существует множество различных значений SpecialFolder , которые можно использовать, включая ProgramFiles и ApplicationData

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

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

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

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

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 Редактировать: Также %AppData% можно найти в реестре (можно сделать удаленно) в HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders и в Program Files в HKLM\Software\Microsoft\Windows\CurrentVersion в ProgramfilesDir.

2 голосов
/ 17 февраля 2011

Переменные окружения - это объединение параметров компьютера и пользователя.Работающий процесс может изменить свою среду, и когда он порождает другой процесс, этот процесс наследует среду процесса, который его создал.

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

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

Это значитПри этом Windows хранит настройки переменных среды в реестре:

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

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

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

2 голосов
/ 17 февраля 2011

Вопрос не имеет смысла.Переменные среды не являются переменными для каждой машины.Например, вы можете ожидать, что %appdata% будет указывать внутри каталога C:\users\, но именно там, где, очевидно, зависит пользовательВход в систему как администратор все еще не помогает вам;это просто скажет вам, где находится админ %appdata%.

1 голос
/ 09 сентября 2011

Насколько я могу судить, единственный способ разрешения% 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 Remoting на удаленной машине, я думаю, это было бы довольно просто ...

...