[英]How to expand environment variables remotely with .NET?
我需要一种在远程计算机上扩展环境变量的方法。
假设我有一个文件夹%appdata%\\MyApp\\Plugins
或%ProgramFiles%\\MyCompany\\MyApp\\Plugins
的路径,并且我想列出该文件夹中的文件以进行审核。 唯一的问题是我想在远程计算机上执行此操作,但是我具有管理员访问权限。
一个额外的问题(但不是必需的)是如何为远程计算机上的给定用户执行此操作?
您将使用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编辑:还可以从注册表中找到%AppData%
(可以远程完成),位于HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders
和程序文件中,位于HKLM\\Software\\Microsoft\\Windows\\CurrentVersion
ProgramfilesDir
下。
这个问题没有道理。 环境变量不是每台机器的变量。 例如,您可以期望%appdata%
指向C:\\users\\
目录,但是确切的位置显然取决于用户。 以管理员身份登录仍然无法帮助您; 那只会告诉您管理员的%appdata%
在哪里。
环境变量是“计算机范围”设置和“每用户设置”的合并。 一个正在运行的进程可能会修改其环境,并且当它产生另一个进程时,该进程会继承创建它的进程的环境。
除非您有权访问在远程计算机上运行的进程(或可以启动该进程),否则就没有“环境”之类的东西:它的上下文根本不存在。 特定进程的环境取决于以下所有功能:
也就是说,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,我想这会很容易...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.