123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- import win32api
- import win32wnet
- import sys
- from winnetwk import *
- import os
- possible_shares = []
- def _doDumpHandle(handle, level = 0):
- indent = " " * level
- while 1:
- items = win32wnet.WNetEnumResource(handle, 0)
- if len(items)==0:
- break
- for item in items:
- try:
- if item.dwDisplayType == RESOURCEDISPLAYTYPE_SHARE:
- print(indent + "Have share with name:", item.lpRemoteName)
- possible_shares.append(item)
- elif item.dwDisplayType == RESOURCEDISPLAYTYPE_GENERIC:
- print(indent + "Have generic resource with name:", item.lpRemoteName)
- else:
- # Try generic!
- print(indent + "Enumerating " + item.lpRemoteName, end=' ')
- k = win32wnet.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,item)
- print()
- _doDumpHandle(k, level + 1)
- win32wnet.WNetCloseEnum(k) # could do k.Close(), but this is a good test!
- except win32wnet.error as details:
- print(indent + "Couldn't enumerate this resource: " + details.strerror)
- def TestOpenEnum():
- print("Enumerating all resources on the network - this may take some time...")
- handle = win32wnet.WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,None)
- try:
- _doDumpHandle(handle)
- finally:
- handle.Close()
- print("Finished dumping all resources.")
- def findUnusedDriveLetter():
- existing = [x[0].lower() for x in win32api.GetLogicalDriveStrings().split('\0') if x]
- handle = win32wnet.WNetOpenEnum(RESOURCE_REMEMBERED,RESOURCETYPE_DISK,0,None)
- try:
- while 1:
- items = win32wnet.WNetEnumResource(handle, 0)
- if len(items)==0:
- break
- xtra = [i.lpLocalName[0].lower() for i in items if i.lpLocalName]
- existing.extend(xtra)
- finally:
- handle.Close()
- for maybe in 'defghijklmnopqrstuvwxyz':
- if maybe not in existing:
- return maybe
- raise RuntimeError("All drive mappings are taken?")
- def TestConnection():
- if len(possible_shares)==0:
- print("Couldn't find any potential shares to connect to")
- return
- localName = findUnusedDriveLetter() + ':'
- for share in possible_shares:
- print("Attempting connection of", localName, "to", share.lpRemoteName)
- try:
- win32wnet.WNetAddConnection2(share.dwType, localName, share.lpRemoteName)
- except win32wnet.error as details:
- print("Couldn't connect: " + details.strerror)
- continue
- # Have a connection.
- try:
- fname = os.path.join(localName + "\\", os.listdir(localName + "\\")[0])
- try:
- print("Universal name of '%s' is '%s'" % (fname, win32wnet.WNetGetUniversalName(fname)))
- except win32wnet.error as details:
- print("Couldn't get universal name of '%s': %s" % (fname, details.strerror))
- print("User name for this connection is", win32wnet.WNetGetUser(localName))
- finally:
- win32wnet.WNetCancelConnection2(localName, 0, 0)
- # and do it again, but this time by using the more modern
- # NETRESOURCE way.
- nr = win32wnet.NETRESOURCE()
- nr.dwType = share.dwType
- nr.lpLocalName = localName
- nr.lpRemoteName = share.lpRemoteName
- win32wnet.WNetAddConnection2(nr)
- win32wnet.WNetCancelConnection2(localName, 0, 0)
- # and one more time using WNetAddConnection3
- win32wnet.WNetAddConnection3(0, nr)
- win32wnet.WNetCancelConnection2(localName, 0, 0)
- # Only do the first share that succeeds.
- break
- def TestGetUser():
- u = win32wnet.WNetGetUser()
- print("Current global user is", repr(u))
- if u != win32wnet.WNetGetUser(None):
- raise RuntimeError("Default value didnt seem to work!")
- TestGetUser()
- TestOpenEnum()
- TestConnection()
|