如何使用.NET远程扩展环境变量?

我需要一种方法来扩展远程机器上的环境变量。

假设我有一个文件夹%appdata%\MyApp\Plugins%ProgramFiles%\MyCompany\MyApp\Plugins的路径,我想列出该文件夹中的文件以供审核。 唯一的问题是我想在远程计算机上执行此操作,但我有管理员访问权限。

一个额外的问题(但不是必不可少的)是如何为远程机器上的给定用户执行此操作?

您将使用GetFolderPath 。 您可以使用许多不同的SpecialFolder值,包括ProgramFilesApplicationData

 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编辑:还可以在HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders和程序文件的HKLM\Software\Microsoft\Windows\CurrentVersionProgramfilesDir下的注册表中找到%AppData% (可以远程完成)。

这个问题没有意义。 环境变量不是每机器变量。 例如,您可以期望%appdata%指向C:\users\目录内,但显然取决于用户。 以管理员身份登录仍然无法帮助您; 这只会告诉你管理员的%appdata%在哪里。

环境变量是“计算机范围”和“每用户”设置的合并。 正在运行的进程可能会修改其环境,并且当它生成另一个进程时,该进程将inheritance创建它的进程的环境。

除非您可以访问在远程计算机上运行的进程(或者可以启动进程),否则就不会出现“环境”:它的上下文根本就不存在。 特定进程的环境是以下所有function的函数:

  • 从父进程的环境inheritance的环境(可能在与子进程不同的用户帐户下运行。)
  • 计算机范围的环境设置。
  • 用户指定的任何环境设置。
  • 流程本身所做的任何更改。

话虽这么说,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 Remoting,我想这会相当容易……