ファイルサーバーのUNCパスをGPOで配布すると、どうしても「ショートカット(.lnk)」になってしまい、エクスプローラーの「ネットワークの場所」と同じ“ファイル フォルダー型”にできず、見た目や操作感が気になる……。本記事では、そのモヤモヤを解消し、Active Directory+GPO環境で「ネットワークの場所」をきちんと“フォルダー型”として配布する具体的な手順と仕組みを、PowerShell案/GPPだけで完結させる案の2パターンで詳しく解説します。
GPOで配布したUNC共有が「ただのショートカット」になってしまう理由
一般的に、ファイルサーバーの共有フォルダーをユーザーに配布したい場合、GPO(グループ ポリシー)の「ユーザー構成 > 環境設定 > Windows の設定 > ショートカット」を使うことが多いと思います。
しかしこの方法で \\server\share を配布すると、クライアント側にはデスクトップやスタートメニューなどに通常の .lnk ショートカットが作成されるだけで、エクスプローラーの「PC」画面に表示されるような『ファイル フォルダー型のネットワークの場所』にはなりません。
エクスプローラーのウィザード「ネットワークの場所の追加」から作ると、以下のような“特別扱い”の見た目になります。
- アイコンが通常のショートカットと異なる
- エクスプローラーの「PC」画面の下部に「ネットワークの場所」としてグルーピングされる
- ダブルクリックで直接UNC共有に移動できる
この“特別扱い”を、GPO経由でも再現したくなるのは自然な要望です。結論から言うと、可能です。ポイントは、「ネットワークの場所」の実体がどこに、どのような形で保存されているかを理解することです。
「ネットワークの場所」の正体:NETHOODフォルダーとDesktop.ini
エクスプローラーの「ネットワークの場所」は、ユーザーごとのプロファイル配下にある次のフォルダーで管理されています。
%APPDATA%\Microsoft\Windows\Network Shortcuts
このフォルダーは、Shell API 上では NETHOOD という特殊フォルダーとして扱われます。ここに、各「ネットワークの場所」ごとにサブフォルダーが作成され、その中身で見た目と動作が決まります。
構造は非常にシンプルで、以下の3つさえ揃えばOKです。
| 要素 | パス | 必要な属性 | 役割 |
|---|---|---|---|
| フォルダー(表示名) | %APPDATA%\Microsoft\Windows\Network Shortcuts\<表示名> | 読み取り専用(R) | 1つの「ネットワークの場所」を表すコンテナー |
| Desktop.ini | …\<表示名>\Desktop.ini | 隠し(H)+システム(S) | このフォルダーを「ネットワークの場所」として扱うためのメタ情報 |
| target.lnk | …\<表示名>\target.lnk | 通常のショートカット | 実際にどのUNCパスを指すかを定義 |
Desktop.ini の中身は、最低限以下の値があれば「ネットワークの場所」として動作します。
[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
Flags=2
この CLSID2 が「ネットワークの場所」用のシェル拡張を示すGUIDで、Flags=2 がそれを有効化するフラグです。
つまり、GPOから直接この構造を再現してやれば、ウィザードを使わずとも“本物の”ネットワークの場所を量産できます。
アプローチの全体像:PowerShell案とGPPだけで作る案
ここからは、次の2つのやり方を順番に解説します。
- 方法A:PowerShellスクリプトで作成し、ログオンスクリプトやGPP「スクリプト」から配布する
- 方法B:GPOの「環境設定」だけを駆使して、フォルダー・Desktop.ini・target.lnk を組み立てる
| 項目 | 方法A: PowerShell | 方法B: GPPのみ |
|---|---|---|
| 実装難易度 | スクリプトに慣れていれば簡単 | 項目は多いがクリック操作だけで完結 |
| 柔軟性 | 条件分岐・ループなど高い | GPPのターゲット条件に依存 |
| 配布場所 | ログオン スクリプト/GPPスクリプト | ユーザー構成 > 環境設定 > Windows の設定 |
| PowerShell実行ポリシー | Bypass などの考慮が必要 | 不要 |
方法A:PowerShellで「ネットワークの場所」を作成して配布する
PowerShellスクリプト本体
まずは、ネットワークの場所を作成する汎用スクリプトを用意します。ファイル名は例として Add-NetworkLocation.ps1 とします。
param(
[Parameter(Mandatory=$true)] [string]$Name, # エクスプローラーに表示される名前
[Parameter(Mandatory=$true)] [string]$TargetPath # 例: \\server\share
)
# NETHOOD (%APPDATA%\Microsoft\Windows\Network Shortcuts) の実パス
$shell = New-Object -ComObject Shell.Application
$wsh = New-Object -ComObject WScript.Shell
$netHood = $shell.Namespace(0x13).Self.Path
$loc = Join-Path $netHood $Name
if (!(Test-Path $loc)) { New-Item -ItemType Directory -Path $loc -Force | Out-Null }
# フォルダーを「読み取り専用」にして Desktop.ini を有効化
attrib +r $loc
# Desktop.ini を作成(ネットワークの場所のシェル拡張)
$ini = Join-Path $loc 'Desktop.ini'
if (!(Test-Path $ini)) {
Set-Content -Path $ini -Value "[.ShellClassInfo]"
Add-Content -Path $ini -Value "CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}"
Add-Content -Path $ini -Value "Flags=2"
}
# Desktop.ini を隠し+システムに
attrib +h +s $ini
# 実体となるショートカット(同フォルダー内の target.lnk)
$link = Join-Path $loc 'target.lnk'
$sc = $wsh.CreateShortcut($link)
$sc.TargetPath = $TargetPath
$sc.Save()
このスクリプトは、-Name で渡した名前のフォルダーを NETHOOD 配下に作り、その中に Desktop.ini と target.lnk を自動生成します。
ログオンスクリプト/GPP「スクリプト(PowerShell)」から呼び出す
次に、上記スクリプトをGPOから呼び出します。代表的なパターンは以下の通りです。
- 古くからのやり方:ユーザー構成 > ポリシー > Windows の設定 > スクリプト(ログオン)
- 新しめのやり方:ユーザー構成 > 環境設定 > コントロール パネルの設定 > スクリプト(PowerShell)
たとえば、ログオン スクリプトで次のように呼び出します。
powershell.exe -ExecutionPolicy Bypass -File "\\domain\netlogon\Scripts\Add-NetworkLocation.ps1" -Name "部門共有" -TargetPath "\\filesrv01\dept"
ポイント:
\\domain\netlogon\Scriptsなど、ドメイン コントローラーから全ユーザーが参照できる共有にAdd-NetworkLocation.ps1を置く- ユーザーごとに表示名やパスを変えたい場合は、GPOを分けるか、条件付きで複数回呼び出す
- 既に同名のネットワークの場所があっても、スクリプトは上書き形式で動くので安心
スクリプトの中身のポイント解説
Shell.ApplicationのNamespace(0x13)は、NETHOOD(ネットワーク ショートカット)フォルダーを表します。attrib +r $locによって、フォルダーを読み取り専用にすると、WindowsがDesktop.iniを特別扱いするようになります。Desktop.iniのCLSID2に指定している GUID が「ネットワークの場所」の見た目と動作を司るシェル拡張です。target.lnkは単なるショートカットですが、フォルダー直下にこの名前で置くことで、ネットワークの場所の“実体”になります。
この方法なら、Windows 10 / Windows 11 の混在環境でも、ほぼ共通の仕組みで配布できます。
方法B:GPOの「環境設定」だけで“ネットワークの場所”を作る
PowerShellを使いたくない/実行ポリシーの調整を避けたい場合は、GPOの「環境設定」だけで同じ構造を作ることもできます。やるべきことは、次の3ステップです。
- フォルダーを作成し、「読み取り専用」属性を付与
Desktop.iniに正しい内容を書き、隠し+システム属性を付与- 同フォルダー内に
target.lnkを作成し、UNC先を指すショートカットにする
手順1:フォルダーの作成
GPMCで対象GPOを編集し、以下の設定を追加します。
- ユーザー構成 > 環境設定 > Windows の設定 > フォルダー を右クリックして「新規」
- フォルダーのパス:
%APPDATA%\Microsoft\Windows\Network Shortcuts\<表示名> - 操作:作成(必要に応じて「更新」でも可)
- 「共通」タブで 「適用されなくなったらこの項目を削除」 を有効化しておくと、将来不要になったとき自動削除されて便利です。
フォルダーの読み取り専用属性は、GPPの「フォルダー」項目だけではうまく付かないことがあります。その場合は、後続の「ファイル」または「コマンド」項目で attrib を使って付与します。
手順2:Desktop.ini を GPPで配布する
次に、「INIファイル」項目を作成し、Desktop.ini の中身を定義します。
- ユーザー構成 > 環境設定 > Windows の設定 > INI ファイル を右クリックして「新規 > INI ファイル」
- ファイル名:
%APPDATA%\Microsoft\Windows\Network Shortcuts\<表示名>\Desktop.ini - セクション名:
.ShellClassInfo - プロパティに以下2つを追加
- CLSID2 =
{0AFACED1-E828-11D1-9187-B532F1E9575D} - Flags =
2
- CLSID2 =
続いて、この Desktop.ini に隠し+システム属性を付けます。方法はいくつかあります。
- 「ユーザー構成 > 環境設定 > Windows の設定 > ファイル」で同じパスを指定し、属性で「隠し」「システム」をONにする
- または、「ユーザー構成 > 環境設定 > Windows の設定 > コマンド」で以下を実行
cmd /c attrib +h +s "%APPDATA%\Microsoft\Windows\Network Shortcuts\<表示名>\Desktop.ini"
どちらの方法でも構いませんが、実環境でテストし、きちんと属性が付くことを確認してください。
手順3:target.lnk ショートカットの作成
最後に、実際のUNC共有を指すショートカット target.lnk を作成します。
- ユーザー構成 > 環境設定 > Windows の設定 > ショートカット を右クリックして「新規 > ショートカット」
- 名前:
<表示名>\target
(名前にバックスラッシュを含めることで、「<表示名>」配下にtarget.lnkが作られます) - 対象の種類:ファイル システム
- オブジェクトの場所:「My Network Locations」(マイ ネットワークの場所)
- 対象パス:
\\server\share(実際のUNC先) - 「共通」タブで 「適用されなくなったらこの項目を削除」 を有効化
ここでよくあるミスは、名前を単に「<表示名>」にしてしまうことです。この場合、Network Shortcuts 直下に <表示名>.lnk ができてしまい、意図した構造になりません。
必ず「名前」を <表示名>\target として、サブフォルダーの下に .lnk を作る形にしてください。
方法Aと方法Bの選び方
| 観点 | PowerShell方式(方法A) | GPPのみ方式(方法B) |
|---|---|---|
| 導入コスト | スクリプト1本+呼び出しのみでシンプル | GPP項目を複数作る必要がある |
| バージョン差異への耐性 | スクリプト側で条件分岐しやすい | GPPのUI仕様に依存 |
| トラブルシュート | ログ出力を仕込めるので追いやすい | GPPの結果はイベントログと実ファイル確認で追う |
| 運用・保守 | スクリプトの改修で一括調整しやすい | GUI操作だけで変更できるので非スクリプト派に優しい |
社内にPowerShellに慣れている管理者がいるなら、方法Aを選ぶ方が柔軟でおすすめです。逆に、「スクリプトは最小限にしたい」「運用担当がGUIしか触らない」といった場合は、GPPだけで完結する方法Bが向いています。
よくある不具合とその対処
Desktop.iniが見えてしまう/フォルダーが通常の見た目のまま
症状:
Network Shortcuts\<表示名>フォルダー内にDesktop.iniが丸見え- エクスプローラー上のアイコンが通常のフォルダーやショートカットのまま
主な原因:
- 親フォルダー
<表示名>に読み取り専用(R)属性が付いていない Desktop.iniに隠し(H)+システム(S)属性が付いていない
対策として、実機で以下のコマンドを試してみると、問題の切り分けがしやすくなります。
cd "%APPDATA%\Microsoft\Windows\Network Shortcuts"
attrib +r "<表示名>"
attrib +h +s ".\<表示名>\Desktop.ini"
dir /a "<表示名>"
これで見た目が切り替わるようであれば、GPP側で属性が正しく付くよう定義を見直してください。
同じ名前のショートカットが二重に出てしまう
症状:
- 「ネットワークの場所」のアイコンと、同じ名前の通常ショートカットが並んで表示される
主な原因:
- GPPの「ショートカット」項目で、
<表示名>と同名の .lnk をNetwork Shortcuts直下に作ってしまっている Desktop.iniをターゲットにしたショートカットを作成している
対策:
- ショートカット項目の名前を
<表示名>\targetにする - 対象パスはUNC先(
\\server\share)にし、Desktop.iniを指さない - 重複している .lnk を削除し、「共通」タブの「適用されなくなったらこの項目を削除」を有効にする
左のナビゲーション ウィンドウに出ない
「ネットワークの場所」は、基本的にエクスプローラーの「PC」画面の一覧に表示されるものであり、クイックアクセスやナビゲーションツリーに常駐するものではありません。
もし「左のナビにも常に出ていてほしい」という要件がある場合は、以下のような別の仕組みを組み合わせます。
- ピン留め済みのクイックアクセス設定をテンプレートとして配布する
- ログオンスクリプトやPowerShellでクイックアクセスにピン留めする処理を追加する
- 社内で用意したカスタムナビゲーション(ランチャー)を併用する
本記事で紹介している方法はあくまで「PC > ネットワークの場所」セクションに、純正と同等の見た目で表示させることを目的としています。
適用範囲を部署ごとに分けたい/不要になったら自動削除したい
GPPには「項目レベルのターゲット」という強力な機能があります。これを使うことで、同じGPO内でもユーザーやコンピューターの属性に応じて配布先を出し分けられます。
よくある条件例:
- ユーザーが属するセキュリティ グループ(例:部署別グループ)
- ユーザーのOU(組織単位)
- クライアントのIPアドレス帯やサブネット
- OSのバージョン(Windows 10 / Windows 11 で分けるなど)
また、「共通」タブの 「適用されなくなったらこの項目を削除」 チェックを有効にしておくと、ターゲット条件から外れたユーザーからは、ネットワークの場所が自動的に消えるため、運用が非常に楽になります。
応用:部門別に複数のネットワークの場所を出し分ける例
具体的なイメージとして、以下のようなシナリオを考えてみます。
- 総務部向け:
\\filesrv01\generalを「総務部共有」として配布 - 経理部向け:
\\filesrv02\accountingを「経理部共有」として配布 - 全社共通:
\\filesrv01\publicを「全社共有」として配布
この場合、PowerShell方式であれば、ログオンスクリプト側でグループ判定を行い、必要な呼び出しだけ実行することができます。
# 疑似コード例
if (UserIsMemberOf("GRP_Somu")) {
& "\\domain\netlogon\Scripts\Add-NetworkLocation.ps1" -Name "総務部共有" -TargetPath "\\filesrv01\general"
}
if (UserIsMemberOf("GRP_Keiri")) {
& "\\domain\netlogon\Scripts\Add-NetworkLocation.ps1" -Name "経理部共有" -TargetPath "\\filesrv02\accounting"
}
# 全社共通
& "\\domain\netlogon\Scripts\Add-NetworkLocation.ps1" -Name "全社共有" -TargetPath "\\filesrv01\public"
GPP方式であれば、
- 「総務部共有」用のフォルダー/INI/ショートカット項目一式を作り、「項目レベルのターゲット」でグループ
GRP_Somu限定にする - 「経理部共有」も同様に
GRP_Keiriに限定する - 「全社共有」はターゲット条件を付けず、全ユーザーに適用する
といった構成にすることで、ユーザーは自分に関係するネットワークの場所だけがエクスプローラーに現れるようになり、運用・サポートの手間も削減できます。
セキュリティと運用上の注意点
ここまでの手順は、あくまで「見た目と入口を整える」ためのものです。実際のアクセス制御は、従来どおり以下で行う必要があります。
- 共有フォルダーの共有権限
- フォルダー階層のNTFSアクセス権
たとえば、GPOで「経理部共有」のネットワークの場所を全ユーザーに配ってしまったとしても、NTFS権限でアクセスが拒否されていれば、実データへの不正な閲覧はできません。逆に言うと、GPO側の配布制御だけに頼るのではなく、必ずNTFS権限で最終的なアクセス制御をかけるのが基本です。
また、ユーザーがローミング プロファイル/フォルダーリダイレクトを利用している場合、%APPDATA% がサーバー側に置かれていることもあります。その場合でも、基本構造は変わりませんが、ネットワークの場所の情報がサーバー上に保存されることになるため、バックアップや容量設計を考慮しておくと安心です。
確認・トラブルシューティングのためのチェックリスト
最後に、うまく動かない場合に確認すべきポイントを表にまとめておきます。
| 確認項目 | チェック内容 | 確認方法 |
|---|---|---|
| フォルダー構造 | Network Shortcuts\<表示名> が存在するか | エクスプローラー/cmd.exe で確認 |
| フォルダー属性 | <表示名> に「R」属性が付いているか | attrib "<表示名>" を実行 |
| Desktop.ini の中身 | .ShellClassInfo セクションに CLSID2 と Flags があるか | メモ帳などで開いて内容を確認 |
| Desktop.ini の属性 | 「H」「S」属性が付いているか | attrib ".\<表示名>\Desktop.ini" を実行 |
| target.lnk の有無 | target.lnk が同じフォルダー内に存在するか | dir "<表示名>" で確認 |
| ショートカットの中身 | ターゲットが意図したUNC先か | 右クリック > プロパティ で確認 |
| GPPのターゲット条件 | 対象ユーザー/グループにマッチしているか | GPMCで項目レベルのターゲットを確認 |
まとめ:ショートカットではない“本物”のネットワークの場所をGPOで配布する
本記事で紹介した通り、「ネットワークの場所」は特別な魔法ではなく、
%APPDATA%\Microsoft\Windows\Network Shortcuts配下に- 読み取り専用のサブフォルダー(表示名)を作り
- その中に、特定のCLSID2とFlagsを持った
Desktop.iniと - UNC先を指す
target.lnk
を揃えているだけの仕組みです。
この構造さえ理解してしまえば、
- PowerShellスクリプトで一気に自動化する(方法A)
- GPO「環境設定」のフォルダー/INIファイル/ショートカットを組み合わせる(方法B)
という2つのアプローチで、Active Directory 環境全体に対して、統一された「ネットワークの場所」を安定して配布できます。
ショートカット(.lnk)に比べて、ユーザー側の見た目もエクスプローラーと自然に統合され、サポート問い合わせの低減や、ナビゲーションの一貫性向上にもつながります。GPOでUNC共有を配っているが、見た目がどうしても気になるという環境では、ぜひ一度、本記事の手順を検証環境で試してみてください。

コメント