#!/usr/bin/env python #win32wnetfile.py import os import os.path import shutil import sys import win32wnet def netcopy(host, source, dest_dir, username=None, password=None, move=False): """ Copies files or directories to a remote computer. """ wnet_connect(host, username, password) dest_dir = covert_unc(host, dest_dir) # Pad a backslash to the destination directory if not provided. if not dest_dir[len(dest_dir) - 1] == '\\': dest_dir = ''.join([dest_dir, '\\']) # Create the destination dir if its not there. if not os.path.exists(dest_dir): os.makedirs(dest_dir) else: # Create a directory anyway if file exists so as to raise an error. if not os.path.isdir(dest_dir): os.makedirs(dest_dir) if move: shutil.move(source, dest_dir) else: shutil.copy(source, dest_dir) def netdelete(host, path, username=None, password=None): """ Deletes files or directories on a remote computer. """ wnet_connect(host, username, password) path = covert_unc(host, path) if os.path.exists(path): # Delete directory tree if object is a directory. if os.path.isfile(path): os.remove(path) else: shutil.rmtree(path) else: # Remove anyway if non-existent so as to raise an error. os.remove(path) def netmove(host, source, dest_dir, username=None, password=None): return netcopy(host, source, dest_dir, username, password, True) def covert_unc(host, path): """ Convert a file path on a host to a UNC path.""" return ''.join(['\\\\', host, '\\', path.replace(':', '$')]) def wnet_connect(host, username, password): unc = ''.join(['\\\\', host]) try: win32wnet.WNetAddConnection2(0, None, unc, None, username, password) except Exception, err: if isinstance(err, win32wnet.error): # Disconnect previous connections if detected, and reconnect. if err[0] == 1219: win32wnet.WNetCancelConnection2(unc, 0, 0) return wnet_connect(host, username, password) raise err if __name__ == '__main__': # Copy "c:\documents" folder/file to "c:\transferred" on host "w0001". netcopy('w0001', 'c:\\documents', 'c:\\transferred') # Move with account credentials. netmove('w0001', 'c:\\documents', 'c:\\transferred', 'admin', 'adminpass') # Delete with another account. netdelete('w0001', 'c:\\transferred', 'testdom\\user1', 'user1pass') # Transfer files using different accounts, to multiple computers. accounts = [ ('administrator', 'adminpass'), ('desktopeng', 'depass'), ('testdom\\administrator', 'dompass')] computers = ['w0001', 'w0002', 'w0003', 'w0004', 'w0005', 'w0006'] auth_failed = [] transfer_failed = [] for computer in computers: # Try to authenticate with the each account provided. for account in accounts: username, password = account try: wnet_connect(computer, username, password) except Exception, err: # Look for authentication failures. if isinstance(err, win32wnet.error) and err[0] == 1326: if account == accounts[len(accounts) -1]: auth_failed.append(computer) else: transfer_failed.append(computer) break else: try: netcopy(computer, 'c:\\documents', 'c:\\transferred') except Exception, err: print err transfer_failed.append(computer) break # Status report print 'Authentication failure: %s' % (str(auth_failed).strip("[]'")) print 'Unknown failure: %s' % (str(transfer_failed).strip("[]'"))