[英]What is the best way to map windows drives using Python?
What is the best way to map a network share to a windows drive using Python? 使用Python将网络共享映射到Windows驱动器的最佳方法是什么? This share also requires a username and password.
此共享还需要用户名和密码。
Building off of @Anon's suggestion: 建立@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)
I prefer this simple approach, especially if all the information is static. 我更喜欢这种简单的方法,特别是如果所有信息都是静态的。
Okay, Here's another method... 好的,这是另一种方法......
This one was after going through win32wnet. 这是在经历了win32wnet之后。 Let me know what you think...
让我知道你的想法...
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
And to unmap, just use.... 要取消映射,只需使用....
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
Here are a couple links which show use of the win32net module that should provide the functionality you need. 这里有几个链接显示了win32net模块的使用,它应该提供您需要的功能。
http://docs.activestate.com/activepython/2.4/pywin32/html/win32/help/win32net.html http://www.blog.pythonlibrary.org/?p=20 http://docs.activestate.com/activepython/2.4/pywin32/html/win32/help/win32net.html http://www.blog.pythonlibrary.org/?p=20
Assuming that you import necessary libraries, This was a part of an RPC server where the client requested the server to map a drive locally... 假设您导入了必要的库,这是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',)
================Check the white spaces from here, these were a part of a function============ ================从这里检查空白区域,这些都是函数的一部分============
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
I'd go with IronPython and this article : Mapping a Drive Letter Programmatically . 我将使用IronPython和本文: 以编程方式映射驱动器号 。 Or you could use the Win32 API directly.
或者您可以直接使用Win32 API。
I don't have a server to test with here at home, but maybe you could simply use the standard library's subprocess module to execute the appropriate NET USE command? 我家里没有服务器可以测试,但也许你可以简单地使用标准库的子进程模块来执行相应的NET USE命令?
Looking at NET HELP USE from a windows command prompt, looks like you should be able to enter both the password and user id in the net use command to map the drive. 从Windows命令提示符查看NET HELP USE,看起来您应该能够在net use命令中输入密码和用户ID来映射驱动器。
A quick test in the interpreter of a bare net use command w/o the mapping stuff: 在没有映射内容的裸网使用命令的解释器中快速测试:
>>> import subprocess
>>> subprocess.check_call(['net', 'use'])
New connections will be remembered.
There are no entries in the list.
0
>>>
I had trouble getting this line to work: 我无法让这条线路工作:
win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK, drive, networkPath, None, user, password) win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK,drive,networkPath,None,user,password)
But was successful with this: 但是成功了:
win32wnet.WNetAddConnection2(1, 'Z:', r'\\UNCpath\\share', None, 'login', 'password') win32wnet.WNetAddConnection2(1,'Z:',r'\\ UNCpath \\ share',无,'登录','密码')
If you want to map the current login user, i think subprocess solve your problem. 如果你想映射当前的登录用户,我认为子进程可以解决你的问题。 But is you want to control different mappings for different users, from a single master account.
但是,您是否希望从单个主帐户控制不同用户的不同映射。 You could do this from the register of windows
你可以从windows的注册表中做到这一点
The idea is to load the profile of a given user. 想法是加载给定用户的配置文件。
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)
An alternative to subprocess: 子流程的替代方法:
import os
os.system("net use m: \\\\shared\folder")
Or 要么
import os
cmd = "net use m: \\\\shared\folder"
os.system(cmd)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.