如何在计划任务中执行Get-CrmConnection及解决本地CDS连接空引用错误
本地部署Common Data Service连接NullReference报错解决方案
报错核心定位
从堆栈跟踪链路可以判定,异常触发于SDK调用Discovery服务拉取组织信息、校验组织版本阶段,核心是LocatorServiceContext、组织版本字段为null导致的未捕获引用异常,不属于基础网络连通性类故障。
排查与解决步骤
- 核对SDK组件与本地实例的版本匹配性
这是该报错最高发的诱因:本地部署的CDS/Dynamics 365实例若为9.x早期版本(如9.0首发、9.1初始RTM版),但当前PowerShell会话加载的Microsoft.Xrm.Tooling.Connector为配套云端CDS的6.x及以上高版本SDK,会在解析本地服务返回的组织版本字段时触发空引用。
解决方式:将会话中加载的CrmSdk相关dll,替换为与本地实例大版本完全匹配的官方SDK安装包组件,禁止混用云端版SDK连接本地部署实例。 - 修正Discovery服务的访问地址
调用Get-CrmConnection时若仅传入组织级服务地址,SDK会自动拼接默认路径调用Discovery端点做组织校验。如果本地实例采用AD域/IFD部署模式,Discovery端点未配置对应的访问权限、绑定的服务证书存在失效问题,会导致拉取不到有效的LocatorServiceContext上下文对象,直接触发空引用。
解决方式:连接时不依赖SDK自动拼接的Discovery路径,显式指定Discovery服务全路径——本地AD部署的Discovery默认路径为https://<CDS服务器域名>/XRMServices/2011/Discovery.svc,IFD部署的需替换为公网暴露的对应Discovery端点地址。 - 补全TLS协议的兼容配置
当前脚本中仅强制启用TLS1.2,但如果本地CDS部署在Windows Server 2016及更早版本的操作系统上,服务端若未完整启用TLS1.2,客户端强制锁定单一TLS版本时,服务端返回的身份认证上下文会为不完整的空结构,同样会触发该空引用。
解决方式:将脚本中的安全协议配置替换为多协议兼容枚举,避免强制锁定单一协议版本:
待确认服务端实际启用的TLS版本后,再按需锁定对应协议。[System.Net.ServicePointManager]::SecurityProtocol = ` [System.Net.SecurityProtocolType]::Tls12 -bor ` [System.Net.SecurityProtocolType]::Tls11 -bor ` [System.Net.SecurityProtocolType]::Tls - 启用兜底连接逻辑绕过Discovery校验
完成以上配置排查后若仍触发报错,可通过跳过自动Discovery校验的方式直接建立连接,从根本上规避空引用的触发路径,修改后的连接命令参考:$conn = Get-CrmConnection ` -Credential $Credential ` -OrganizationName "$crmOrganization" ` -ServerUrl "https://<CDS服务器域名>/api/data/v9.2/" ` -SkipDiscovery ` -ErrorAction Stop -Verbose
辅助验证方法:在部署CDS的服务器本地用相同脚本执行连接操作,如果本地可正常连接,说明故障为跨机器访问的地址解析、协议匹配类问题;如果本地执行也报相同错误,需检查MSCRM_CONFIG系统库中的组织版本记录是否存在空值,排查组织元数据损坏问题。
内容的提问来源于stack exchange,提问作者cyvocross
相关产品推荐
相关产品推荐

