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