连接HPC调度器时如何通过编程方式设置用户密码凭证
解决方案
1. 核心问题原因
出现该报错的核心原因是SetCachedCredentials传入的账号格式,和HPC集群身份校验要求的格式不匹配,导致存储的凭证无法通过验证。
2. 修复方案
第一步:调整用户名格式
你从密钥库读取的userName必须和集群要求的账号格式完全匹配:
- 域环境下必须携带域前缀,格式为
域名\用户名,例如HPCDOMAIN\svc_job_scheduler - 也可使用UPN格式,例如
svc_job_scheduler@hpdomian.com
如果仅传入纯用户名不带域信息,SetCachedCredentials存储的凭证和集群身份验证时查询的凭证不匹配,就会触发连接失败。
第二步:调整调用逻辑
HPC Scheduler API要求SetCachedCredentials传入的用户名,必须和ConnectServiceAsClient委托返回的用户名完全一致,包括大小写、域格式。同时需要确认从密钥库取出的密码没有被编码转义。
调整后的参考代码:
string userName = GetKeyVaultSecret("ServiceAccount"); string password = GetKeyVaultSecret("ServiceAccountPassword"); // 补充域前缀,可根据你实际的环境域名修改 if (!userName.Contains("\\")) { userName = $"你的实际域名\\{userName}"; } using (IScheduler scheduler = new Scheduler()) { try { Console.WriteLine("Connecting to {0} as {1}...", clusterName, userName); scheduler.SetCachedCredentials(userName,password); scheduler.ConnectServiceAsClient(clusterName, () => userName); } catch (Exception e) { Console.Error.WriteLine("Could not connect to the scheduler: {0}", e.Message); if (e.InnerException != null) Console.WriteLine(e.InnerException.Message.ToString()); return 1; } }
额外排查点
- 确认服务账号已经加入HPC集群的调度器访问权限组,拥有作业提交权限
- 确认密钥库中存储的密码没有过期,且没有包含特殊字符被错误转义
- 如果是工作组环境的HPC集群,需要确保服务账号在调度器节点本地存在,且用户名和密码和你传入的完全一致
内容的提问来源于stack exchange,提问作者Nigel Findlater
相关产品推荐
相关产品推荐

