我需要一种在远程机器上扩展环境变量的方法。
假设我有一个指向文件夹的路径%appdata%\MyApp\Plugins
或者%ProgramFiles%\MyCompany\MyApp\Plugins
,我想为审计目的列出该文件夹中的文件。唯一的问题是我想在一个远程机器上完成这个操作,不过我拥有管理员权限。
额外的问题(但不是必要的)是如何为远程机器上的特定用户执行此操作?
我需要一种在远程机器上扩展环境变量的方法。
假设我有一个指向文件夹的路径%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%
在哪里。%Program Files%
是 N:\SharedPrograms\Secretaries\
,那你又会遇到麻烦。由于这些环境变量可以从漫游配置文件和/或登录脚本中派生出来,除非在实际机器上进行真正的登录,否则你将无法获取它们。 - MSaltersHKEY_CURRENT_USER\Environment
- 系统变量。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\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,我想这将相当容易...