我需要一种在远程计算机上扩展环境变量的方法。
假设我有一个文件夹%appdata%\MyApp\Plugins
或%ProgramFiles%\MyCompany\MyApp\Plugins
的路径,我想列出该文件夹中的文件以供审核。唯一的问题是我想在远程计算机上执行此操作,但我有管理员访问权限。
另一个问题(但不是必不可少的)是如何在远程机器上为给定用户执行此操作?
答案 0 :(得分:8)
您将使用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"]);
或者从here
获取所有远程环境变量及其值的列表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
的程序文件中找到。
答案 1 :(得分:2)
这个问题没有意义。环境变量不是每机器变量。例如,您可以期望%appdata%
指向C:\users\
目录,但显然取决于用户。以管理员身份登录仍然无法帮助您;这只会告诉你管理员%appdata%
的位置。
答案 2 :(得分:2)
环境变量是'puter-wide和per-user设置的合并。正在运行的进程可能修改其环境,当它生成另一个进程时,该进程将继承创建它的进程的环境。
除非您可以访问在远程计算机上运行的进程(或者可以启动进程),否则就不会出现“环境”:它的上下文根本就不存在。特定过程的环境是以下所有因素的函数:
话虽这么说,Windows将其环境变量设置保存在注册表中:
HKEY_CURRENT_USER\Environment
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
如果您对远程计算机的注册表有适当的访问权限,那么您应该能够找到所需的内容。
请注意,环境变量可能是根据其他环境变量定义的:我相信您可能会自己处理适当的扩展。
答案 3 :(得分:1)
据我所知,解决%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,我想这会相当容易......