使用Go调用vCenter API查询加密密钥状态时遇ManagedObjectNotFound错误求助
修复vCenter加密密钥状态查询的
ManagedObjectNotFound错误 核心问题分析
你遇到的ManagedObjectNotFound错误来自两个关键误用:
- 错误使用CNS客户端:
queryCryptoKeyStatus是vCenter加密管理(CryptoManager)的API,和容器存储服务(CNS)无关,用cns.Client调用必然找不到对应托管对象。 - 错误的托管对象类型:API要求传入
CryptoManager类型的MoRef,你传入了Datacenter类型,vCenter无法识别。
修复后的完整代码
package main import ( "context" "fmt" "net/url" "github.com/vmware/govmomi/session" "github.com/vmware/govmomi/soap" "github.com/vmware/govmomi/vim25" "github.com/vmware/govmomi/vim25/methods" "github.com/vmware/govmomi/vim25/types" ) func vcenterStatus() { vURL := "https://admin_user:pwd@vc.671236ac.region.avslab.domain.com/sdk" // 处理URL解析错误 urlObj, err := url.Parse(vURL) if err != nil { fmt.Printf("URL解析错误: %v\n", err) return } soapClient := soap.NewClient(urlObj, false) // 创建vim25客户端并检查错误 c1, err := vim25.NewClient(context.TODO(), soapClient) if err != nil { fmt.Printf("创建vim25客户端错误: %v\n", err) return } // 验证会话有效性,确认账号密码和连接正常 sess := session.NewManager(c1) _, err = sess.UserSession(context.TODO()) if err != nil { fmt.Printf("会话无效,请检查账号密码或vCenter连接: %v\n", err) return } keyId := "2134ec-412e8f-cwq2ef-e799-99f" // 简化CryptoKeyId初始化,嵌入类型DynamicData无需显式声明 cryptoKeyId := types.CryptoKeyId{ KeyId: keyId, KeyProviderId: &types.KeyProviderId{ Id: "tnt-kms-cluster", }, } cryptoKeyIds := []types.CryptoKeyId{cryptoKeyId} // 使用CryptoManager类型的MoRef,value可通过vCenter MOB页面确认(通常为cryptoManager-1) moRef := types.ManagedObjectReference{ Type: "CryptoManager", Value: "cryptoManager-1", } queryReq := types.QueryCryptoKeyStatus{ This: moRef, CryptoKeyIds: cryptoKeyIds, MaxResults: 15, } // 直接用vim25客户端调用API,替换错误的cnsClient resBody, err := methods.QueryCryptoKeyStatus(context.TODO(), c1, &queryReq) if err != nil { fmt.Printf("查询密钥状态错误: %v\n", err) return } fmt.Println("SUCCESS !!", resBody) } func main() { vcenterStatus() }
关键修复细节
- 替换客户端类型:移除
cns.NewClient调用,直接使用vim25.Client,因为queryCryptoKeyStatus属于vCenter核心加密管理模块,和CNS无关。 - 修正MoRef:将MoRef的
Type改为CryptoManager,确认Value的方法:- 访问vCenter的MOB页面(
https://你的vc地址/mob) - 在首页找到
CryptoManager对象,查看其value字段(通常为cryptoManager-1)
- 访问vCenter的MOB页面(
- 完善错误处理:
- 处理URL解析错误,避免无效URL导致后续问题
- 客户端创建失败后直接返回,避免执行后续无效代码
- 添加会话验证,提前排查账号密码或连接问题
- 简化结构体初始化:Go中嵌入类型(如
DynamicData)无需显式初始化,编译器会自动处理,简化代码结构。
额外验证步骤
- 确认密钥ID和密钥提供者ID与vCenter加密管理页面的信息完全一致
- 确保使用的账号拥有
CryptoManager.Read权限,否则可能返回权限错误
内容的提问来源于stack exchange,提问作者Animesh Kr Singh
相关产品推荐
相关产品推荐

