bugfix> python > 投稿
質問:

Windows 10でPythonを使用してすべてのドライブとネットワークロケーションのリストを取得するにはどうすればよいですか?リストは、「ローカルドライブ」、「ネットワークドライブ」、および「ネットワークロケーション」で構成されている必要があります。

TYP           HD      HD        NETWORK LOCATION
some_list = ["C:\\", "D:\\", "\\some.network.address\some_folder"]

私のソリューション:

問題を解決するより良い方法はありますか?私のショートカット解析は「良い」ソリューションだとは思わない...

import win32api
from os import getenv, listdir
from os.path import join
import win32com.client
NETWORK_SHORTCUTS_FOLDER_PATH = getenv('APPDATA') + \
                                "\\Microsoft\\Windows\\Network Shortcuts"
# Add Logical Drives
drives = win32api.GetLogicalDriveStrings()
drives = drives.split('\000')[:-1]
# Add Network Locations
network_shortcuts = [join(NETWORK_SHORTCUTS_FOLDER_PATH, f) +
                     "\\target.lnk" for f in listdir(NETWORK_SHORTCUTS_FOLDER_PATH)]
shell = win32com.client.Dispatch("WScript.Shell")
for network_shortcut in network_shortcuts:
    shortcut = shell.CreateShortCut(network_shortcut)
    drives.append(shortcut.Targetpath)
print(drives)

ネットワークの場所(ネットワークドライブだけではありません!):
回答 1 件
  • <サブ>(最初のセクションは背景情報です。具体的な提案については、次の水平線までスクロールします。)


    実際には、以前のバージョンと同じ方法でWin10にネットワークドライブをマップします:Windows 10でネットワークドライブをマップする方法。

    スクリーンショットに示したのはじゃない マップされたドライブではなく、「ネットワークショートカット」。 XPには、最後にアクセスしたネットワーク共有の自動生成リストを収集する「ネットワークプレース」と呼ばれる同様の機能がありました。最近開いたファイルの「最近」と同じです。そのフォルダーには KNOWNFOLDERID があります   FOLDERID_NetHood  そして、 NetHood を使用しました  ユーザープロファイルのフォルダ。この機能は、かなり役に立たないことが判明したため、Vistaで削除されました。これと同じ KNOWNFOLDERID  現在は基本的に同じ「ネットワークロケーション」機能に使用されますが、リストは手および/またはグループポリシーを介してドメイン管理者によって構成され、 Network Shortcuts を占有します  デフォルトでフォルダ。

    ネットワークロケーションは、管理しやすいため、マップされたドライブよりも推奨されているようです。

    マップされたドライブとネットワークの場所の両方がユーザーごとであることに注意してください。


    これで、コードを堅牢にするために必要なのは、場所と形式に関する「内部知識」に頼るのではなく、可能な場合は提供されたAPIを使用することだけです。

    フォルダーパスをハードコードせずに、 GetKnownFolderPath で取得する 。この関数は pywin32 によって公開されていません   v223 現在  しかし、古い互換性のある SHGetFolderPath を使用できます :

    from win32com.shell import shell,shellcon
    NETWORK_SHORTCUTS_FOLDER_PATH = shell.SHGetFolderPath(0,shellcon.CSIDL_NETHOOD,None,0)
    
    

    ショートカットと新しい「フォルダショートカット」(まとめて「シェルリンク」と呼ばれる)を読み取るには、 shell32  公式インターフェースを提供しますが、COM IUnknown のみ ベースの1つ、 IShellLink  ( ShellLink により実装  COMクラス)、したがって pywin32 では使用できません 。また、 Wscript.Shell  通常のショートカットでのみ機能します。したがって、このためのアルゴリズムは十分です。

あなたの答え