web-dev-qa-db-fra.com

Quel est le meilleur moyen de mapper les lecteurs Windows en utilisant Python?

Quel est le meilleur moyen de mapper un partage réseau sur un lecteur Windows à l'aide de Python? Ce partage nécessite également un nom d'utilisateur et un mot de passe.

22
Gary Willoughby

J'irais avec IronPython et cet article: Mapper une lettre de lecteur par programme . Ou vous pouvez utiliser directement l'API Win32.

2
Geo

Construire à partir de la suggestion de @ 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)

Je préfère cette approche simple, surtout si toutes les informations sont statiques.

18
aqua

Ok, voici une autre méthode ...

Celui-ci était après avoir traversé win32wnet. Laissez-moi savoir ce que vous pensez...

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

Et pour démapper, il suffit d'utiliser ....

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
7
Varun

En supposant que vous importiez les bibliothèques nécessaires, il s’agissait d’une partie d’un serveur RPC où le client avait demandé au serveur de mapper un lecteur localement ...

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

================ Vérifiez les espaces blancs à partir d'ici, ils faisaient partie d'une fonction ============

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
3
Varun

Voici quelques liens montrant l'utilisation du module win32net qui devrait fournir les fonctionnalités dont vous avez besoin.

http://docs.activestate.com/activepython/2.4/pywin32/html/win32/help/win32net.htmlhttp://www.blog.pythonlibrary.org/?p = 20

3
Michael Mior

Je n'ai pas de serveur avec lequel tester à la maison, mais vous pourriez peut-être simplement utiliser le module de sous-processus de la bibliothèque standard pour exécuter la commande Net Use appropriée?

En regardant NET HELP USE à partir d'une invite de commande windows, vous devriez pouvoir entrer à la fois le mot de passe et l'ID utilisateur dans la commande Net Use pour mapper le lecteur.

Un test rapide dans l’interpréteur d’une commande nue de Net Use sans les éléments de mappage:

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

There are no entries in the list.

0
>>>
2
Anon

Une alternative au sous-processus:

import os

os.system("Net Use m: \\\\shared\folder")

Ou 

import os

cmd = "Net Use m: \\\\shared\folder"
os.system(cmd)
0
David Metcalfe

J'ai eu du mal à faire fonctionner cette ligne: 

win32wnet.WNetAddConnection2 (win32netcon.RESOURCETYPE_DISK, lecteur, chemin réseau, aucun, utilisateur, mot de passe)

Mais a réussi avec ceci:

win32wnet.WNetAddConnection2 (1, 'Z:', r '\ UNCpath\share', Aucun, 'Connexion', 'Mot de passe') 

0
user3033659

Si vous souhaitez mapper l'utilisateur connecté actuel, je pense que le sous-processus résout votre problème. Mais vous voulez contrôler différents mappages pour différents utilisateurs, à partir d'un seul compte principal. Vous pouvez le faire à partir du registre de Windows

L'idée est de charger le profil d'un utilisateur donné.

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)
0
pjl