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,
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, 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, 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, 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()
|