使用Python通过WMI修改Windows服务账户密码遇类型不匹配错误求助
解决WMI修改Windows服务账户密码的类型不匹配错误
错误原因
你调用Win32_Service.Change()方法时,错误地把参数拼接成一个字符串传递,而该方法需要逐个传递对应位置的参数,而非格式化后的字符串。这种传递方式导致COM对象接收到的参数类型不符合要求,触发了Type mismatch(类型不匹配)错误。
Win32_Service的Change方法参数按顺序定义为:
- DisplayName
- PathName
- ServiceType
- ErrorControl
- StartMode
- DesktopInteract
- StartName
- Password
- LoadOrderGroup
- LoadOrderGroupDependencies
- ServiceDependencies
若仅需修改密码,需将前7个不需要变更的参数传None,最后传递新密码即可。
修正后的代码
import wmi import getpass c = wmi.WMI() username = str.casefold("maria") pwd = getpass.getpass() def update_service_password(target_username, new_password): for service in c.Win32_Service(): service_start_name = str.casefold(str(service.StartName)) if target_username in service_start_name: print(f"找到服务: {service.Name}") # 前7个参数传None表示不修改,第8个参数传入新密码 result = service.Change( None, None, None, None, None, None, None, new_password ) # 返回结果的第一个元素为错误码,0代表操作成功 if result[0] == 0: print(f"服务 {service.Name} 的密码修改成功") # 可选:修改密码后建议重启服务使新密码生效 # service.StopService() # service.StartService() else: print(f"服务 {service.Name} 修改失败,错误码: {result[0]}") update_service_password(username, pwd)
注意事项
- 权限要求:运行脚本必须具备管理员权限,否则会因权限不足无法修改服务账户密码。
- 服务重启:修改密码后需要重启对应服务,新密码才能生效,代码中已注释重启逻辑,可按需启用。
- 账户匹配:
StartName通常包含域名(如DOMAIN\username),用包含判断是合理的;若需精确匹配,建议直接对比完整账户名。
内容的提问来源于stack exchange,提问作者Leslie
相关产品推荐
相关产品推荐

