全ユーザー共通のフォルダを取得する

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

現在ログインしているユーザーのフォルダは、Environment.GetFolderPath()メソッドで取得することができるが、全ユーザー共通のフォルダを取得することはできない。 そこで、レジストリから位置を取得する。

具体的には、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\にアクセスし、そこから「マイ ドキュメント」や「すべてのプログラム」に相当するサブキーの値を読み込む。

VB.NET
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
Imports System

Imports Microsoft.Win32

Namespace SantaMarta.Tips.AllUsersSpecialFolders

    Class SpecialFolders

        ''' <summary>
        ''' アプリケーションのメイン エントリ ポイントです。
        ''' </summary>
        Shared Sub Main(ByVal args As String())

            ' 現在のユーザーのフォルダ
            Dim currentUserDocuments As String = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
            Dim currentUserStartMenu As String = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)
            Dim currentUserPrograms As String = Environment.GetFolderPath(Environment.SpecialFolder.Programs)

            ' 全ユーザー共通のフォルダ
            Dim allUsersDocuments As String = ""
            Dim allUsersStartMenu As String = ""
            Dim allUsersPrograms As String = ""

            ' レジストリから全ユーザー共通のフォルダを取得する
            Dim regKey As RegistryKey

            Try

                regKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders", False)

                allUsersDocuments = DirectCast(regKey.GetValue("Common Documents", Nothing), String)
                allUsersStartMenu = DirectCast(regKey.GetValue("Common Start Menu", Nothing), String)
                allUsersPrograms = DirectCast(regKey.GetValue("Common Programs", Nothing), String)

            Finally

                If Not regKey Is Nothing Then regKey.Close()

            End Try

            Console.WriteLine("現在のユーザー")
            Console.WriteLine("マイ ドキュメント: {0}", currentUserDocuments)
            Console.WriteLine("スタートメニュー: {0}", currentUserStartMenu)
            Console.WriteLine("全てのプログラム: {0}", currentUserPrograms)

            Console.WriteLine("全ユーザー共通")
            Console.WriteLine("マイ ドキュメント: {0}", allUsersDocuments)
            Console.WriteLine("スタートメニュー: {0}", allUsersStartMenu)
            Console.WriteLine("全てのプログラム: {0}", allUsersPrograms)

        End Sub

    End Class

End Namespace
出力例
現在のユーザー
マイ ドキュメント: C:\Documents and Settings\******\My Documents
スタートメニュー: C:\Documents and Settings\******\スタート メニュー
全てのプログラム: C:\Documents and Settings\******\スタート メニュー\プログラム
全ユーザー共通
マイ ドキュメント: C:\Documents and Settings\All Users\Documents
スタートメニュー: C:\Documents and Settings\All Users\スタート メニュー
全てのプログラム: C:\Documents and Settings\All Users\スタート メニュー\プログラム
Press any key to continue

(******には現在のユーザー名が入ります)

このほかに取得できるフォルダとキーの組み合わせは以下の通り。 ただし、実行環境によって得られる結果が変わる可能性あり(下表はWindows XP Home Edition SP1上で実行した結果より作成)。

全ユーザー共通のフォルダとキー
キー名フォルダ
Common AppDataDocuments and Settings\All Users\Application Data
Common DesktopDocuments and Settings\All Users\デスクトップ
Common DocumentsDocuments and Settings\All Users\Documents
Common FavoritesDocuments and Settings\All Users\Favorites
Common ProgramsDocuments and Settings\All Users\スタート メニュー\プログラム
Common Start MenuDocuments and Settings\All Users\スタート メニュー
Common StartupDocuments and Settings\All Users\スタート メニュー\プログラム\スタートアップ
Common TemplatesDocuments and Settings\All Users\Templates