简体   繁体   English

使用Python映射Windows驱动器的最佳方法是什么?

[英]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.

相关问题 使用Python枚举CD驱动器(Windows) - Enumerate CD-Drives using Python (Windows) 在Windows上安装python的最佳方法是什么? - What is the best way to install python on Windows 使用 Python 在 Linux、Windows 和 Mac 上列出磁盘驱动器的跨平台方法? - Cross platform way to list disk drives on Linux, Windows and Mac using Python? 使用 python 下载文件的最佳方法是什么 - What is the best way to download files using python Python:用书面报告的路线创建地图png的最佳方法是什么? - Python: What is the best way of creating a png of a map with a route for a written report? 在 Windows 上彻底重新安装 Python 的最佳方法是什么? - What is the best way to make a clean reinstall of Python on Windows? 有没有办法列出所有可用的 Windows 驱动器? - Is there a way to list all the available Windows' drives? 使用Python管理多平台视频流的最佳方法是什么? - What is the best way to manage multiplatform video stream using Python? 使用Python或Java,创建图表的最佳方法是什么? - Using Python or Java, what would be the best way to create charts? 使用Python 3查询mongodb集合的最佳方法是什么 - What is the best way to query a mongodb collection using Python 3
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM