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 _GetNetworkResources(self): self.log.debug("Getting networkResource list...") try: h = win32wnet.WNetOpenEnum(5, 1, 0, None) #5=RESOURCE_CONTEXT #1=RESOURCETYPE_DISK lst = win32wnet.WNetEnumResource(h, 64) #65以上の指定不可 win32wnet.WNetCloseEnum(h) except win32net.error as er: dialog( _("エラー"), _("ネットワーク上のリソース一覧を取得できませんでした(%(error)s)") % {"error": str(er)}) return #end 情報取得失敗 lst.pop(0) #先頭はドライブではない者が入るので省く for l in lst: ret, shfileinfo = shell.SHGetFileInfo(l.lpRemoteName, 0, shellcon.SHGFI_ICON) s = browsableObjects.NetworkResource() self.log.debug("network resource found and check IP address:" + l.lpRemoteName[2:]) s.Initialize(l.lpRemoteName[2:], l.lpRemoteName, socket.getaddrinfo(l.lpRemoteName[2:], None)[0][4][0], shfileinfo[0]) self.networkResources.append(s)
def mount_share(share_path, param_username, param_password): """Uses the pywin32 library to mount a share and updates the filename""" # check if such a path has already been mounted print "Mounting the share " + share_path handle = win32wnet.WNetOpenEnum(win32netcon.RESOURCE_CONNECTED, win32netcon.RESOURCETYPE_DISK, 0, None) resources = win32wnet.WNetEnumResource(handle) is_mounted = False used_letters = "" letter = None for resource in resources: if share_path == resource.lpRemoteName and resource.lpLocalName: # found a mounted drive with the same path so we set the correct letter # lpLocalName is None when the mount does not redirect a local device # we do not want to consider such a mount is_mounted = True letter = resource.lpLocalName if resource.lpLocalName: used_letters += resource.lpLocalName # append so we can search a free letter later win32wnet.WNetCloseEnum(handle) if not is_mounted: for letter in ascii_uppercase[::-1]: if letter not in used_letters: letter += ":" break net_resource = win32wnet.NETRESOURCE() net_resource.dwType = win32netcon.RESOURCETYPE_DISK net_resource.lpLocalName = letter net_resource.lpRemoteName = share_path net_resource.lpProvider = None win32wnet.WNetAddConnection2(net_resource, param_username, param_password) print("Share successfully mounted with letter %s " % letter) return letter
def __iter__(self): """Blah, blah, blah, ...""" enum = wn.WNetOpenEnum(self._scope, self._type, self._usage, None) try: for rsrc in wn.WNetEnumResource(enum): yield rsrc finally: wn.WNetCloseEnum(enum)
def Initialize(self, path, silent=False): """リソースの情報を取得し、リストを初期化する。""" self.log.debug("Getting resources list...") self.rootDirectory = path t = misc.Timer() if isinstance( path, list ): # パラメータがリストなら、browsableObjects のリストとして処理刷る(ファイルリストを取得しないでコピーする) self.resources += path return errorCodes.OK # end copy self.resources.clear() if not silent: globalVars.app.say(path[2:]) # 取得対象を構造体にセット rootResource = win32wnet.NETRESOURCE() rootResource.lpRemoteName = path # リソースリストの取得 try: h = win32wnet.WNetOpenEnum(2, 1, 0, rootResource) # 2=RESOURCE_GLOBALNET # 1=RESOURCETYPE_DISK lst = win32wnet.WNetEnumResource(h, 64) # 65以上の指定不可 win32wnet.WNetCloseEnum(h) except win32wnet.error as er: dialog( _("エラー"), _("ネットワーク上のリソース一覧を取得できませんでした(%(error)s)") % {"error": str(er)}) return errorCodes.ACCESS_DENIED for l in lst: ret, shfileinfo = shell.SHGetFileInfo(l.lpRemoteName, 0, shellcon.SHGFI_ICON) s = browsableObjects.NetworkResource() self.log.debug("network resource found and check IP address:" + l.lpRemoteName[2:]) s.Initialize(l.lpRemoteName[len(path) + 1:], l.lpRemoteName, "", shfileinfo[0]) self.resources.append(s) self.log.debug("Network resource list created in %d seconds." % t.elapsed) self.log.debug(str(len(self.resources)) + " resources found.") return errorCodes.OK
def GetNetworkResources(taskState=None, param=None): # 同期処理でも呼び出し可能。パラメータ無しで呼ぶ。 sync_resources = [] try: h = win32wnet.WNetOpenEnum(5, 1, 0, None) # 5=RESOURCE_CONTEXT # 1=RESOURCETYPE_DISK lst = win32wnet.WNetEnumResource(h, 64) # 65以上の指定不可 win32wnet.WNetCloseEnum(h) except win32net.error as er: if taskState: param["onFinish"](-1) # コールバックに通知 return True else: # 同期処理 raise err return None # end 同期処理 # end 情報取得失敗 if taskState and taskState.canceled: return False lst.pop(0) # 先頭はドライブではない者が入るので省く for l in lst: ret, shfileinfo = shell.SHGetFileInfo( l.lpRemoteName, 0, shellcon.SHGFI_ICON) if taskState and taskState.canceled: return False addr = misc.ResolveLocalIpAddress(l.lpRemoteName[2:]) s = browsableObjects.NetworkResource() s.Initialize(l.lpRemoteName[2:], l.lpRemoteName, addr, shfileinfo[0]) if taskState and taskState.canceled: return False sync_resources.append(s) # end 同期処理 # end 追加ループ if taskState and taskState.canceled: return False if taskState: if taskState: while(not param["isReady"]()): time.sleep(0.3) for s in sync_resources: wx.CallAfter(param["onAppend"], s) wx.CallAfter(param["onFinish"], len(lst)) return True else: return sync_resources
def _doDumpHandle(self, handle): while 1: items = win32wnet.WNetEnumResource(handle) if len(items) == 0: break for item in items: try: if item.lpProvider != "Microsoft Terminal Services": continue if item.dwDisplayType == RESOURCEDISPLAYTYPE_SHARE: self._add_to_sharedisk(item.lpRemoteName) else: k = win32wnet.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, item) self._doDumpHandle(k) win32wnet.WNetCloseEnum(k) except Exception as E: logger.exception(E)
import win32wnet import socket h = win32wnet.WNetOpenEnum(5, 1, 0, None) #5=RESOURCE_CONTEXT #1=RESOURCETYPE_DISK lst = win32wnet.WNetEnumResource(h, 64) #65以上の指定不可 win32wnet.WNetCloseEnum(h) lst.pop(0) for l in lst: print("------------------") print(l.lpLocalName) print(l.lpRemoteName) for address in socket.getaddrinfo(l.lpRemoteName[2:], None): print(address[4][0]) #動かない時は下記を参考にサービスを起動するとよい #https://itojisan.xyz/trouble/12595/#3