使用pyvmomi查询vCenter Server Appliance虚拟机时权限报错求助
使用pyVmomi连接VCSA时的权限问题及解答
错误信息
pyVmomi.VmomiSupport.vim.fault.NoPermission: (vim.fault.NoPermission) { dynamicType = <unset>, dynamicProperty = (vmodl.DynamicProperty) [], msg = 'Permission to perform this operation was denied.', faultCause = <unset>, faultMessage = (vmodl.LocalizableMessage) [], object = 'vim.Folder:group-d1', privilegeId = 'System.View', missingPrivileges = (vim.fault.NoPermission.EntityPrivileges) [ (vim.fault.NoPermission.EntityPrivileges) { dynamicType = <unset>, dynamicProperty = (vmodl.DynamicProperty) [], entity = 'vim.Folder:group-d1', privilegeIds = (str) [ 'System.View' ] } ] }
关联Python代码
import atexit import ssl from pyVim import connect from pyVmomi import vim import pdb def vconnect(hostIP,port=None): if (True): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.check_hostname = False context.verify_mode = ssl.CERT_NONE # disable our certificate checking for lab else: context = ssl.create_default_context() context.options |= ssl.OP_NO_TLSv1_3 #cipher = 'DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-GCM-SHA256' #context.set_ciphers(cipher) pdb.set_trace() if (port): service_instance = connect.SmartConnect(host=str(hostIP), # build python connection to vSphere user="root", pwd="MySillyPwd", port=port, sslContext=context) else: service_instance = connect.SmartConnect(host=str(hostIP), # build python connection to vSphere user="root", pwd="MySillyPwd", sslContext=context) atexit.register(connect.Disconnect, service_instance) # build disconnect logic content = service_instance.RetrieveContent() container = content.rootFolder # starting point to look into viewType = [vim.VirtualMachine] # object types to look for recursive = True # whether we should look into it recursively containerView = content.viewManager.CreateContainerView(container, viewType, recursive) # create container view children = containerView.view for child in children: # for each statement to iterate all names of VMs in the environment summary = child.summary print(summary.config.name) # connecting to ESX host vconnect("192.168.160.160") # connecting to vcsa VM vconnect("192.168.160.170", 443)
场景说明
在Workstation 16上运行嵌套ESX,通过Windows CLI在该ESX上部署VCSA。连接ESX主机查询虚拟机正常,但连接VCSA时触发上述权限错误。尝试添加默认端口443后问题依旧,查阅资料提到需设置全局权限,但当前使用VCSA设备管理界面而非vSphere Client,界面与示例不符,因此提出以下问题:
问题1:上述错误是否由试用许可证导致?
不是。试用许可证仅限制vMotion、分布式交换机等高级功能,System.View属于基础查看权限,试用版也会开放该权限。错误核心是当前使用的root账号在VCSA中缺少对应实体的查看权限。
问题2:vCenter Server管理(VCSA)设备与vSphere Client有何区别?
- VCSA设备管理界面:是VCSA虚拟机自带的嵌入式管理页面,仅负责设备级运维,包括VCSA的系统配置、网络设置、存储管理、备份恢复、证书管理等,不涉及vSphere资源(虚拟机、主机、集群)的权限和日常运维。
- vSphere Client:是管理vSphere整体环境的核心客户端(Web版或桌面版),可对VCSA、ESX主机、虚拟机、集群等所有vSphere资源进行权限配置、资源调度、日常运维操作。
问题3:是否可以在VCSA上修改"全局权限",还是需要使用vSphere Client操作?
无法在VCSA设备管理界面修改全局权限,必须通过vSphere Client操作,步骤如下:
- 登录vSphere Client(Web版地址通常为
https://<VCSA-IP>/ui); - 点击左上角菜单,选择系统>权限;
- 在权限页面点击添加权限;
- 选择要授权的用户(此处为
root),分配包含System.View的角色(如"只读"角色或自定义角色); - 勾选传播到子对象,确保权限覆盖根文件夹及所有子实体。
注意:VCSA的root账号默认是设备操作系统管理员,并非vSphere环境的全局管理员,需在vSphere Client中为其分配对应vSphere权限才能通过pyVmomi正常访问。
内容的提问来源于stack exchange,提问作者Skegg
相关产品推荐
相关产品推荐

