首页 > 解决方案 > 如何使用 Python 访问不同/远程 Windows 机器?

问题描述

我正在使用机器A,我正在尝试通过Python访问机器B以将文件从机器B复制到机器A。

我已经尝试过这里解释的方法如何连接到远程 Windows 机器以使用 python 执行命令?,但没有运气,因为我什至无法访问远程机器。我对其他解决方案持开放态度,如果使用 Python 3+ 会更好。这是一个正在使用的代码示例。

ip = r'\\IP.IP.IP.IP'
username = r'AccountUserName'
password = r'AccountPassword'
    # -------------------------------- with win32net

    import win32net
    import win32file

    data = {
        'remote': r'\\IP.IP.IP.IP\C$', 
        'local': 'C:',
        'username': username,
        'password': password 
    }

    win32net.NetUseAdd(None, 2, data)



    # -------------------------------- with wmi

    import wmi
    from socket import *
    try:
        print ("Establishing connection to %s" %ip)
        connection = wmi.WMI(ip, user=username, password=password )
        print ("Connection established")
    except wmi.x_wmi:
        print ("Your Username and Password of "+getfqdn(ip)+" are wrong.")

根据此处的文档https://docs.microsoft.com/en-us/windows/win32/api/lmuse/nf-lmuse-netuseadd 如果要从同一台计算机运行该函数,则该脚本正在从(A ),然后第一个参数 f NetUseAdd 可以保留为 NONE,但是我得到了错误

    pywintypes.error: (87, 'NetUseAdd', 'The parameter is incorrect.')

虽然如果我用“127.0.0.1”更改它,我会收到错误消息

    pywintypes.error: (50, 'NetUseAdd', 'The request is not supported.')

最后,如果我使用我尝试访问的相同 IP 更改它,我会收到错误

    pywintypes.error: (1326, 'NetUseAdd', 'Logon failure: unknown user name or bad password.')

它给出了错误

    Your Username and Password of \\IP.IP.IP.IP are wrong.

标签: pythonnetworkingwmi

解决方案


可以有多种方法来实现这一点。下面给出了其中之一,它使用了内置的 Windows 实用程序。

import os

machine_b = {"ip":"10.197.145.244","user":"administrator","pwd":"abc1234"}
src = r"C:\Temp" # folder to copy from remote machine
dest = r"C:\Python27\build\temp" # destination folder on host machine
network_drive_letter = "Z:"
source_driver_letter = os.path.splitdrive(src)[0][0]
cmd = "netuse %s \\%s\%s$ %s /u:%s"%(network_drive_letter, machine_b["ip"],source_driver_letter,machine_b["pwd"],machine_b["user"])
os.system(cmd)
cmd = "robocopy %s %s /mir"%(src.replace(source_driver_letter,network_drive_letter),dest)
os.system(cmd)

您可以通过处理异常并将 os.system 替换为 subprocess.Popen 调用来改进此代码。注意:小心使用 /MIR 开关,因为它可以复制和删除主机中的文件。它创建目标文件夹的镜像。


推荐阅读