C# 如何使用.NET远程扩展环境变量?
我需要一种在远程机器上扩展环境变量的方法 假设我有一个文件夹C# 如何使用.NET远程扩展环境变量?,c#,.net,environment-variables,remote-access,C#,.net,Environment Variables,Remote Access,我需要一种在远程机器上扩展环境变量的方法 假设我有一个文件夹%appdata%\MyApp\Plugins或%ProgramFiles%\MyCompany\MyApp\Plugins的路径,我想列出该文件夹中的文件以供审核。唯一的问题是我想在远程机器上做这件事,但是我有管理员权限访问它 一个额外的问题(但不是必要的)是如何为远程机器上的给定用户做到这一点?这个问题没有意义。环境变量不是每台机器的变量。例如,您可以期望%appdata%指向C:\users\目录中的某个位置,但具体位置显然取决于
%appdata%\MyApp\Plugins
或%ProgramFiles%\MyCompany\MyApp\Plugins
的路径,我想列出该文件夹中的文件以供审核。唯一的问题是我想在远程机器上做这件事,但是我有管理员权限访问它
一个额外的问题(但不是必要的)是如何为远程机器上的给定用户做到这一点?这个问题没有意义。环境变量不是每台机器的变量。例如,您可以期望
%appdata%
指向C:\users\
目录中的某个位置,但具体位置显然取决于用户。以管理员身份登录对您仍然没有帮助;这只会告诉您管理员的%appdata%
在哪里。您将使用。您可以使用许多不同的值,包括程序文件
和应用程序数据
string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
然后你就可以把它和你剩下的路结合起来
string full_path = Path.Combine(path, "\MyApp\Plugins");
在远程机器上,您可以尝试以下操作
对于所有远程环境变量及其值的列表,请从
操作编辑:
另外,
%AppData%
可以从注册表中找到(可以远程完成),网址是HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell文件夹
,程序文件位于HKLM\Software\Microsoft\Windows\CurrentVersion
,在ProgramfilesDir
下,环境变量是“计算机范围和每用户设置”的合并。正在运行的进程可以修改其环境,当它产生另一个进程时,该进程将继承创建它的进程的环境
除非您有权访问远程计算机上运行的进程(或者可以启动一个进程),否则没有“环境”这样的东西:它的上下文根本不存在。特定流程的环境是以下所有功能的函数:
- 从父进程环境继承的环境(可能在与子进程不同的用户帐户下运行)
- 计算机范围的环境设置
- 用户指定的任何环境设置
- 过程本身所做的任何更改
- 用户变量。
HKEY\U CURRENT\U User\Environment
- 系统变量。
HKEY\U LOCAL\U MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
请注意,环境变量可能是根据其他环境变量定义的:我相信您可能会自己处理适当的扩展。据我所知,解析%ProgramFiles%的唯一方法是通过注册表,因为这在Win32_环境中是不公开的(尽管文档另有建议)。所以这很好:
$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远程处理,我想这将相当容易…可能%appdata%是一个坏例子。%ProgramFiles%怎么样?这一点仍然适用,因为它们是%%变量,它们允许在配置文件级别区分系统中常用的路径。您确实需要为特定用户运行此操作。。。除非您对系统的控制允许您有效地假定%Program Files%始终是C:\Program Files\。。。既然如此,何必费心呢?如果
%Program Files%
为'N:\SharedPrograms\secretries',则您将再次使用软管。由于这些环境变量可以从漫游配置文件和/或登录脚本中派生,如果在实际机器上没有真正的登录,您将无法获得它们。这将扩展到本地机器的(当前用户的偶数)程序文件,我需要的是为远程计算机扩展它。不幸的是,Win32_操作系统和Win32_环境都不包含%programfiles%,至少在我正在查看的Win 2003框中不包含。。。
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);
}
}
$key = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$serverName);
$versionKey = $key.OpenSubKey('SOFTWARE\Microsoft\Windows\CurrentVersion');
$versionKey.GetValue('ProgramFilesDir')