Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用.NET远程扩展环境变量?_C#_.net_Environment Variables_Remote Access - Fatal编程技术网

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

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

除非您有权访问远程计算机上运行的进程(或者可以启动一个进程),否则没有“环境”这样的东西:它的上下文根本不存在。特定流程的环境是以下所有功能的函数:

  • 从父进程环境继承的环境(可能在与子进程不同的用户帐户下运行)
  • 计算机范围的环境设置
  • 用户指定的任何环境设置
  • 过程本身所做的任何更改
也就是说,Windows在注册表中保留其环境变量设置:

  • 用户变量。
    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')