我试图获取的实际值的环境变量。
这是我到目前为止有:在.NET中获取远程计算机上的环境变量的实际值
这样的作品,但这里的问题:通过“WINDIR”作为名称得到“%SYSTEMROOT%”作为价值。我真的想要是实际路径,即'C:\ Windows'。
我试图使用递归得到值“SYSTEMROOT”的但没有匹配被发现。
我怎样才能确保实际值得到返回?
Thx!
我试图获取的实际值的环境变量。
这是我到目前为止有:在.NET中获取远程计算机上的环境变量的实际值
这样的作品,但这里的问题:通过“WINDIR”作为名称得到“%SYSTEMROOT%”作为价值。我真的想要是实际路径,即'C:\ Windows'。
我试图使用递归得到值“SYSTEMROOT”的但没有匹配被发现。
我怎样才能确保实际值得到返回?
Thx!
不能使用Win32_Environment这一点,但你可以使用远程注册表。
RegistryKey environmentKey = RegistryKey.OpenRemoteBaseKey(
RegistryHive.LocalMachine, "\\server");
RegistryKey key = environmentKey.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", false);
string value = (string)key.GetValue("System");
对于system path variables(如%SystemRoot%
)有没有方便的方法。
您必须通过阅读相应的注册表值来查找这些值。
的%SystemRoot%:下面有一个(不完全)的一些系统变量列表
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRoot或
select windowsdirectory from Win32_OperatingSystem
的%SystemDrive%可以通过检查的%SystemRoot确定%
变量如%AppData%是用户依赖和下
HKEY_USERS\<user SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\AppData
发现我知道它的创意充其量不过这似乎是最简单的解决方案:
开销太大吧?
using (var process = new Process())
{
process.StartInfo.FileName = @"C:\PsTools\PsExec.exe";
process.StartInfo.Arguments = @"\\machineName cmd /c echo " + environmentVar;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
return process.StandardOutput.ReadToEnd();
}
'也许开销太多?'一点都不。特别是当设置反对尝试解析递归变量的兔子踪迹的开销时:'%ComSpec%=%SystemRoot%\ System32 \ cmd.exe'。什么样的恶梦。当我发现你的答案时,我正要放弃。好戏。 – InteXX
为什么%SystemRoot%不可接受?如果你把它放在资源管理器窗口中,你会去到windows的安装目录。因为%SystemRoot%理论上可以是D:\ Windows \。 –
[如何用.NET远程扩展环境变量?](http://stackoverflow.com/questions/5031111/how-to-expand-environment-variables-remotely-with-net) – VVS
@ Ramhound:I编写一个方法**使用** Win32_Process.Create **在远程机器上运行命令**。 **环境变量不会**得到识别**,所以我期待**自己替换它们**。如果有办法**让他们自动识别**,这将**也解决了我的问题**。 – David