使用win32com远程连接Windows后改密码失败,报错'int' object is not callable
解决win32com远程修改Windows账户密码的问题
你遇到的'int' object is not callable错误,是因为Win32_Process.Create方法的调用方式不正确,同时返回值处理也有问题。以下是两种可行的解决方案:
方法1:修正Win32_Process.Create调用
直接调整参数传递和返回值处理逻辑,修复执行net user命令的方式:
locator = win32com.client.Dispatch("WbemScripting.SWbemLocator") wmi_service = locator.ConnectServer(remote_computer, "root\\cimv2", username, password) process_class = wmi_service.Get("Win32_Process") cmd = f'net user "{username}" "{new_password}"' # 按Win32_Process.Create的参数顺序传递:CommandLine, CurrentDirectory, ProcessStartupInfo, ProcessId result, process_id = process_class.Create(cmd, None, None) if result == 0: print(f"{remote_computer}上的{username}密码修改成功。") else: print(f"{remote_computer}上的{username}密码修改失败,错误代码:{result}")
注意事项
- 连接远程WMI的账号必须拥有目标计算机的管理员权限
- 若目标系统开启UAC,可能需要调整远程WMI的UAC权限设置,否则命令执行会失败
方法2:使用Win32_UserAccount.SetPassword(推荐)
直接调用WMI内置的用户账户修改方法,比执行命令更可靠、更符合WMI操作规范:
locator = win32com.client.Dispatch("WbemScripting.SWbemLocator") wmi_service = locator.ConnectServer(remote_computer, "root\\cimv2", username, password) # 查询目标用户账户(域环境下需将Domain改为域名) user_query = f"SELECT * FROM Win32_UserAccount WHERE Name='{username}' AND Domain='{remote_computer}'" user_accounts = wmi_service.ExecQuery(user_query) if not user_accounts: print(f"未找到{remote_computer}上的用户{username}") else: user = user_accounts[0] result = user.SetPassword(new_password) if result == 0: print(f"{remote_computer}上的{username}密码修改成功。") else: print(f"{remote_computer}上的{username}密码修改失败,错误代码:{result}")
错误原因说明
你之前的代码中,process.Create(command=cmd)的命名参数写法不符合win32com对WMI方法的调用规范,导致参数解析错误,触发'int' object is not callable异常;同时result, = ...的返回值解构方式也不正确,Win32_Process.Create会返回错误码和进程ID两个值,需要用两个变量接收。
内容的提问来源于stack exchange,提问作者user27731119
相关产品推荐
相关产品推荐

