使用Python将networking共享映射到Windows驱动器的最佳方法是什么? 此份额还需要用户名和密码。
我会去与IronPython和这篇文章: 映射驱动器盘符编程 。 或者你可以直接使用Win32 API。
@ Anon建议的建议:
# Drive letter: M # Shared drive path: \\shared\folder # Username: user123 # Password: password import subprocess # Disconnect anything on M subprocess.call(r'net use m: /del', shell=True) # Connect to shared drive, use drive letter M subprocess.call(r'net use m: \\shared\folder /user:user123 password', shell=True)
我更喜欢这种简单的方法,特别是如果所有的信息都是静态的。
好的,这是另一种方法
这一个是通过win32wnet后。 让我知道你的想法…
def mapDrive(drive, networkPath, user, password, force=0): print networkPath if (os.path.exists(drive)): print drive, " Drive in use, trying to unmap..." if force: try: win32wnet.WNetCancelConnection2(drive, 1, 1) print drive, "successfully unmapped..." except: print drive, "Unmap failed, This might not be a network drive..." return -1 else: print "Non-forcing call. Will not unmap..." return -1 else: print drive, " drive is free..." if (os.path.exists(networkPath)): print networkPath, " is found..." print "Trying to map ", networkPath, " on to ", drive, " ....." try: win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK, drive, networkPath, None, user, password) except: print "Unexpected error..." return -1 print "Mapping successful" return 1 else: print "Network path unreachable..." return -1
而要取消映射,只需使用….
def unmapDrive(drive, force=0): #Check if the drive is in use if (os.path.exists(drive)): print "drive in use, trying to unmap..." if force == 0: print "Executing un-forced call..." try: win32wnet.WNetCancelConnection2(drive, 1, force) print drive, "successfully unmapped..." return 1 except: print "Unmap failed, try again..." return -1 else: print drive, " Drive is already free..." return -1
这里有几个链接显示使用win32net模块,应该提供您需要的功能。
http://docs.activestate.com/activepython/2.4/pywin32/html/win32/help/win32net.html http://www.blog.pythonlibrary.org/?p=20
我没有服务器在家测试,但也许你可以简单地使用标准库的子进程模块来执行相应的NET USE命令?
从Windows命令提示符查看NET HELP USE,看起来应该能够在net use命令中输入密码和用户ID来映射驱动器。
裸网使用命令解释器中的一个快速测试,不包含映射的东西:
>>> import subprocess >>> subprocess.check_call(['net', 'use']) New connections will be remembered. There are no entries in the list. 0 >>>
假设您导入了必要的库,这是客户端请求服务器在本地映射驱动器的RPC服务器的一部分。
#Small function to check the availability of network resource. def isAvailable(path): winCMD = 'IF EXIST ' + path + ' echo YES' cmdOutPut = subprocess.Popen(winCMD, stdout=subprocess.PIPE, shell=True).communicate() return string.find(str(cmdOutPut), 'YES',) #Small function to check if the mention location is a directory def isDirectory(path): winCMD = 'dir ' + path + ' | FIND ".."' cmdOutPut = subprocess.Popen(winCMD, stdout=subprocess.PIPE, shell=True).communicate() return string.find(str(cmdOutPut), 'DIR',)
================从这里检查空格,这些是函数的一部分============
def mapNetworkDrive(self, drive, networkPath, user, password): #Check for drive availability if isAvailable(drive) > -1: #Drive letter is already in use return -1 #Check for network resource availability if isAvailable(networkPath) == -1: print "Path not accessible: ", networkPath #Network path is not reachable return -1 #Prepare 'NET USE' commands winCMD1 = 'NET USE ' + drive + ' ' + networkPath winCMD2 = winCMD1 + ' ' + password + ' /User' + user print "winCMD1 = ", winCMD1 print "winCMD2 = ", winCMD2 #Execute 'NET USE' command with authentication winCMD = winCMD2 cmdOutPut = subprocess.Popen(winCMD, stdout=subprocess.PIPE, shell=True).communicate() print "Executed: ", winCMD if string.find(str(cmdOutPut), 'successfully',) == -1: print winCMD, " FAILED" winCMD = winCMD1 #Execute 'NET USE' command without authentication, incase session already open cmdOutPut = subprocess.Popen(winCMD, stdout=subprocess.PIPE, shell=True).communicate() print "Executed: ", winCMD if string.find(str(cmdOutPut), 'successfully',) == -1: print winCMD, " FAILED" return -1 #Mapped on second try return 1 #Mapped with first try return 1 def unmapNetworkDrive(self, drive): #Check if the drive is in use if isAvailable(drive) == -1: #Drive is not in use return -1 #Prepare 'NET USE' command winCMD = 'net use ' + drive + ' /DELETE' cmdOutPut = subprocess.Popen(winCMD, stdout=subprocess.PIPE, shell=True).communicate() if string.find(str(cmdOutPut), 'successfully',) == -1: #Could not UN-MAP, this might be a physical drive return -1 #UN-MAP successful return 1
我无法使这条线路工作:
win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK,驱动器,网络路径,无,用户,密码)
但是这个成功了:
win32wnet.WNetAddConnection2(1,'Z:',r'\ UNCpath \ share',None,'login','password')
如果你想映射当前的登录用户,我认为子进程解决你的问题。 但是,您是否想要从一个主帐户控制不同用户的映射。 你可以从Windows的注册表中做到这一点
这个想法是加载给定用户的配置文件。
import win32api import win32security import win32profile import win32netcon import win32net import win32netcon import win32con il = 'G' m = '\\\\192.168.1.16\\my_share_folder' usu = 'my_user' cla = 'passwd' #login the user hUser = win32security.LogonUser( usu, None, cla, win32security.LOGON32_LOGON_NETWORK, win32security.LOGON32_PROVIDER_DEFAULT ) #load the profile hReg = win32profile.LoadUserProfile ( hUser, {"UserName" : usu} ) #alter the regedit entries of usu win32api.RegCreateKey(hReg, "Network") hkey = win32api.RegOpenKey(hReg, "Network\\", 0, win32con.KEY_ALL_ACCESS) win32api.RegCreateKey(hkey, il) hkey = win32api.RegOpenKey(hReg, "Network\\%s" % il, 0, win32con.KEY_ALL_ACCESS) win32api.RegSetValueEx(hkey, "ConnectionType", 0, win32con.REG_DWORD, 1) win32api.RegSetValueEx(hkey, "DeferFlags", 0, win32con.REG_DWORD, 4) win32api.RegSetValueEx(hkey, "ProviderName", 0, win32con.REG_SZ, "Red de Microsoft Windows") win32api.RegSetValueEx(hkey, "ProviderType", 0, win32con.REG_DWORD, 131072) win32api.RegSetValueEx(hkey, "RemotePath", 0, win32con.REG_SZ, m) win32api.RegSetValueEx(hkey, "UserName", 0, win32con.REG_DWORD, 0)