我不相信在虚拟机管理器下运行的操作系统(例如(VMWare 等)直接访问与主机操作系统相关的信息是可能的,因为默认情况下,大多数虚拟机管理器都试图完全隔离主机和来宾系统.
话虽如此,大多数虚拟机管理器都有允许虚拟机共享数据并与主机系统通信的机制。通过使用这些机制,主机操作系统可以将有关自身的信息传达给客户。
选项 1:共享文件
通过主机和来宾之间的共享网络,可以让主机系统将信息写入共享位置的文件,并让来宾打开并使用CreateFile
UNC 路径解析该文件,例如\\host\sharename\file.txt
选项 2:通过套接字或命名管道进行数据传输
主机和来宾之间的共享网络将允许您使用Windows 套接字或命名管道API 来创建 TCP 或 UDP 套接字,或者可以交换数据的命名管道。
这种方法将涉及在主机应用程序上运行的服务器应用程序,它将您所追求的进程信息写入套接字或管道,运行客户端进程的来宾系统可以在其中读取它。
选项 3:远程 Windows 管理规范 (WMI) 查询
WMI 提供了一种获取信息并与 Windows 操作系统的许多方面(包括有关进程的信息)进行交互的标准方法。
这可能是最复杂的选项,因为默认情况下 WMI 不接受来自远程主机(即您的 VM)的查询,因此需要将主机配置为允许远程 WMI 查询。
一旦配置了 WMI,就可以通过 WMI 命令行客户端 ( wmic.exe
) 轻松使用它,因此您可以使用如下查询调用它:
在这个例子中:
%HOST_NAME%
是托管 Windows 7 VM 的系统的名称
%TARGET_PROCESS%
是您想要了解的进程的进程名称
wmi \node:%HOST_NAME% process where name='%TargetProcess%' get executablepath
此特定查询获取 %TargetProcess% 的可执行路径,但根据Win32_Process WMI 类文档1的文档,还有更多可用的属性。
选项 4:共享剪贴板
一些虚拟机管理器允许来宾系统访问主机的剪贴板,因此可以在来宾和主机上运行的应用程序之间交换信息。
我很欣赏这可能是最不传统的选择,但您可以想象使用Windows 剪贴板 API将进程信息写入主机的剪贴板,然后将信息读入来宾系统上的进程。
1注意:尽管Win32_Process
类文档以标题大小写 () 列出了属性,ExecutablePath
但我发现它们仅在wmic
以全小写 ( executablepath
)编写时才能在查询中正常工作