Pythonを使用してネットワーク共有をWindowsドライブにマッピングする最良の方法は何ですか?この共有には、ユーザー名とパスワードも必要です。
私はIronPythonとこの記事を使います: プログラムによるドライブ文字のマッピング 。または、Win32 APIを直接使用することもできます。
@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)
特にすべての情報が静的である場合、私はこの単純なアプローチを好みます。
さて、ここに別の方法があります...
これは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
必要なライブラリをインポートすると仮定すると、これは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
以下は、必要な機能を提供するwin32netモジュールの使用方法を示す2つのリンクです。
http://docs.activestate.com/activepython/2.4/pywin32/html/win32/help/win32net.htmlhttp://www.blog.pythonlibrary.org/?p = 2
ここに自宅でテストするサーバーはありませんが、標準ライブラリのサブプロセスモジュールを使用して、適切なNet Useコマンドを実行できますか?
WindowsコマンドプロンプトからNET HELP USEを見ると、パスワードとユーザーIDの両方をNet Useコマンドに入力してドライブをマッピングできるはずです。
マッピングを行わない、裸のNet Useコマンドのインタープリターでの簡単なテスト:
>>> import subprocess
>>> subprocess.check_call(['net', 'use'])
New connections will be remembered.
There are no entries in the list.
0
>>>
サブプロセスの代替:
import os
os.system("Net Use m: \\\\shared\folder")
または
import os
cmd = "Net Use m: \\\\shared\folder"
os.system(cmd)
この行を機能させるのに苦労しました:
win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK、drive、networkPath、None、user、password)
しかし、これで成功しました:
win32wnet.WNetAddConnection2(1、 'Z:'、r '\ UNCpath\share'、None、 'login'、 'password')
現在のログインユーザーをマップする場合は、サブプロセスで問題が解決すると思います。しかし、単一のマスターアカウントから、ユーザーごとに異なるマッピングを制御する必要があります。あなたは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)