2009-08-13 128 views

回答

2

我没有一台服务器在这里在家进行测试,但也许你可以简单地使用标准库的子模块来执行相应的NET USE命令?

看着从Windows NET USE HELP命令提示符下,看起来你应该能够在net use命令同时输入密码和用户ID映射驱动器。

快速测试在裸net use命令的解释W/O映射东西:

>>> import subprocess 
>>> subprocess.check_call(['net', 'use']) 
New connections will be remembered. 

There are no entries in the list. 

0 
>>> 
2

假设你输入必要的库,这是在客户端请求的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 
6

好的,下面是另一种方法...

这是一个经过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 
+0

使用'win32wnet.WNetAddConnection2'和'win32wnet.WNetCancelConnection2'是一个好主意。但是捕获异常并返回一个返回码看起来没有必要。内置的例外已经为您提供了良好的回报信息。另外,捕捉一个空的“except”不是很好的做法。 – twasbrillig 2016-01-07 21:56:20

17

大厦关闭@匿名的建议的:

# 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) 

我喜欢这个简单的方法,特别是如果所有信息都是静态的。

+0

我对此设置有疑问。当您尝试在Web应用程序中映射驱动器时,驱动器是映射到运行应用程序或服务器的用户的? – wolf97084 2015-03-05 13:05:40

+1

使用'net use a:/ del/Y'强制,否则会挂起要求确认删除 – Tahlor 2017-06-22 22:10:24

+0

另外如果我们使用'net use *'+“\\ UNC path \ folder”,它会自动找到一个空的驱动器槽安装“UNC \ path \ folder” – Dylan 2017-09-23 16:52:03

0

我有麻烦这一行的工作:

win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK,驱动器,networkPath,无,用户名,密码)

但成功与此:

win32wnet .WNetAddConnection2(1,'Z:',r'\ UNCpath \ share',None,'login','password')

0

如果你想映射当前登录用户,我认为子进程解决你的问题。但是,您是否想要控制来自单个主帐户的不同用户的不同映射。你可以从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) 
相关问题