Esempio n. 1
0
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)
Esempio n. 2
0
 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)
Esempio n. 3
0
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
Esempio n. 4
0
 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)
Esempio n. 5
0
 def testWNetEnumResource(self):
     handle = win32wnet.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, None)
     try:
         while 1:
             items = win32wnet.WNetEnumResource(handle, 0)
             if len(items) == 0:
                 break
             for item in items:
                 self._checkItemAttributes(item, NETRESOURCE_attributes)
     finally:
         handle.Close()
Esempio n. 6
0
    def iterConnectableShares(self):
        nr = win32wnet.NETRESOURCE()
        nr.dwScope = RESOURCE_GLOBALNET
        nr.dwUsage = RESOURCEUSAGE_CONTAINER
        nr.lpRemoteName = "\\\\" + win32api.GetComputerName()

        handle = win32wnet.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, nr)
        while 1:
            items = win32wnet.WNetEnumResource(handle, 0)
            if len(items) == 0:
                break
            for item in items:
                if item.dwDisplayType == RESOURCEDISPLAYTYPE_SHARE:
                    yield item
Esempio n. 7
0
 def findUnusedDriveLetter(self):
     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
     self.fail("All drive mappings are taken?")
Esempio n. 8
0
    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
Esempio n. 9
0
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
Esempio n. 10
0
 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)
Esempio n. 11
0
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