You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python通过WMI修改Windows服务账户密码遇类型不匹配错误求助

解决WMI修改Windows服务账户密码的类型不匹配错误

错误原因

你调用Win32_Service.Change()方法时,错误地把参数拼接成一个字符串传递,而该方法需要逐个传递对应位置的参数,而非格式化后的字符串。这种传递方式导致COM对象接收到的参数类型不符合要求,触发了Type mismatch(类型不匹配)错误。

Win32_Service的Change方法参数按顺序定义为:

  1. DisplayName
  2. PathName
  3. ServiceType
  4. ErrorControl
  5. StartMode
  6. DesktopInteract
  7. StartName
  8. Password
  9. LoadOrderGroup
  10. LoadOrderGroupDependencies
  11. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:09:15