wake-up-neo.com

Wie lassen sich Windows-Laufwerke mit Python am besten zuordnen?

Was ist der beste Weg, um eine Netzwerkfreigabe mit Python einem Windows-Laufwerk zuzuordnen? Diese Freigabe erfordert auch einen Benutzernamen und ein Passwort.

22
Gary Willoughby

Ich würde mit IronPython und diesem Artikel gehen: Programmieren eines Laufwerksbuchstabens . Oder Sie können die Win32-API direkt verwenden.

2
Geo

Aufbauend auf @ Anons Vorschlag:

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

Ich bevorzuge diesen einfachen Ansatz, insbesondere wenn alle Informationen statisch sind.

18
aqua

Okay, hier ist eine andere Methode ...

Dieses war nach dem Durchlaufen von win32wnet. Lass mich wissen was du denkst...

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

Und um die Karte aufzuheben, benutze einfach ....

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

Angenommen, Sie importieren die erforderlichen Bibliotheken. Dies war Teil eines RPC-Servers, bei dem der Client den Server aufgefordert hat, ein Laufwerk lokal zuzuordnen.

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

Hier sind ein paar Links, die die Verwendung des win32net-Moduls zeigen, das die Funktionalität bieten sollte, die Sie benötigen.

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

3
Michael Mior

Ich habe keinen Server zum Testen hier zu Hause, aber vielleicht können Sie einfach das Unterprozess-Modul der Standardbibliothek verwenden, um den entsprechenden Net Use-Befehl auszuführen.

Wenn Sie sich NET HELP USE von einem Windows-Befehl aus ansehen, werden Sie in der Lage sein, das Kennwort und die Benutzer-ID in den Net Use-Befehl einzugeben, um das Laufwerk zuzuordnen.

Ein schneller Test im Interpreter eines bloßen Net Use-Befehls ohne Mapping-Sachen:

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

There are no entries in the list.

0
>>>
2
Anon

Eine Alternative zum Subprozess:

import os

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

Oder 

import os

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

Ich hatte Mühe, diese Linie zum Laufen zu bringen: 

win32wnet.WNetAddConnection2 (win32netcon.RESOURCETYPE_DISK, Laufwerk, Netzwerkpfad, Keiner, Benutzer, Kennwort)

War aber damit erfolgreich:

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

0
user3033659

Wenn Sie den aktuellen Login-Benutzer zuordnen möchten, denke ich, dass der Unterprozess Ihr Problem löst. Möchten Sie jedoch verschiedene Zuordnungen für verschiedene Benutzer von einem einzigen Hauptkonto aus steuern. Sie können dies vom Register der Fenster aus tun

Die Idee ist, das Profil eines bestimmten Benutzers zu laden.

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