我正在尝试使用Python调用Virtualbox 6.1的SOAP接口来获取虚拟机的截图。我可以启动这台虚拟机,但是当我尝试获取屏幕布局时会遇到锁定错误。
以下是代码:
import zeep
# helper to show the session lock status
def show_lock_state(session_id):
session_state = service.ISession_getState(session_id)
print('current session state:', session_state)
# connect
client = zeep.Client('http://127.0.0.1:18083?wsdl')
service = client.create_service("{http://www.virtualbox.org/}vboxBinding", 'http://127.0.0.1:18083?wsdl')
manager_id = service.IWebsessionManager_logon('fakeuser', 'fakepassword')
session_id = service.IWebsessionManager_getSessionObject(manager_id)
# get the machine id and start it
machine_id = service.IVirtualBox_findMachine(manager_id, 'Debian')
progress_id = service.IMachine_launchVMProcess(machine_id, session_id, 'gui')
service.IProgress_waitForCompletion(progress_id, -1)
print('Machine has been started!')
show_lock_state(session_id)
# unlock and then lock to be sure, doesn't have any effect apparently
service.ISession_unlockMachine(session_id)
service.IMachine_lockMachine(machine_id, session_id, 'Shared')
show_lock_state(session_id)
console_id = service.ISession_getConsole(session_id)
display_id = service.IConsole_getDisplay(console_id)
print(service.IDisplay_getGuestScreenLayout(display_id))
机器已正确启动,但最后一行显示错误信息VirtualBox错误:rc=0x80004001
,根据我查阅的资料,这意味着会话被锁定。
我尝试释放并重新获取锁,但即使成功执行,错误仍然存在。我查看了文档,但无法找到其他类型的锁,除了不适用于此处正在运行的机器的写锁。我无法在任何语言中找到任何示例。