让我们说我正在运行Windows 7,我将称之为V和P两个主要进程。
V是运行另一个Windows 7实例的虚拟机,而P是我想要了解相关信息的过程,两者都在“顶级”操作系统上。
V中的Windows 7运行的进程C是否可以从V中获取有关P等进程的信息?换句话说,在虚拟机内运行的进程是否可以获取有关正在维护虚拟机进程的操作系统正在运行的进程的任何信息?我觉得它依赖于虚拟机进程的能力,如果它没有被编程为专门检索这些信息那么就不可能。
我已经阅读了另一个关于甚至检测虚拟机是否正在运行进程的难度的主题。有些人觉得它不可靠或不可能。我不确定是否有一种标准的方法可以找到它,我相信该帖子大约是4或5年前。
那么可以通过进程C来完成,还是需要更多的标准例程来完成这个任务呢?
答案 0 :(得分:1)
我不相信在虚拟机管理器下运行的操作系统(例如(VMWare等))可以直接访问与主机操作系统相关的信息,因为默认情况下大多数虚拟机管理器都试图完全隔离主机和客户系统。
据说大多数虚拟机管理器都有允许虚拟机共享数据并与主机系统通信的机制。通过使用这些机制,主机操作系统可以将有关其自身的信息传达给访客。
通过主机和来宾之间的共享网络,主机系统可以将信息写入共享位置的文件,并使用CreateFile
和UNC路径打开并解析该文件。例如\\host\sharename\file.txt
主机和来宾之间的共享网络允许您使用Windows Sockets或Named Pipe API创建TCP或UDP套接字,或者可以通过其命名管道来交换数据。
这种方法涉及在主机应用程序上运行的服务器应用程序,它将您之后的进程信息写入套接字或管道,运行客户端进程的客户机系统可以读取该信息。
WMI提供了一种获取信息并与Windows操作系统的许多方面进行交互的标准方法,包括有关进程的信息。
这可能是最复杂的选项,因为默认情况下WMI不接受来自远程主机(即您的VM)的查询,因此主机需要configured才能允许远程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 Class文档 1 的文档,还有更多可用的属性。
某些虚拟机管理器允许来宾系统访问主机的剪贴板,以便可以在来宾和主机上运行的应用程序之间交换信息。
我很欣赏它可能是最不常见的选项,但你可以想象使用Windows Clipboard API将进程信息写入主机的剪贴板,然后将信息读入客户系统上的进程。
1 注意:虽然Win32_Process
类文档列出了标题案例(ExecutablePath
)中的属性,但我发现它们只能在wmic
中正常工作以全小写(executablepath
)