123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- import os
-
- import win32api
- import win32wnet
- from winnetwk import *
-
- 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()
|