知識マップ: ネットワークドライブとUNCパスの落とし穴 ── 業務アプリでファイルサーバー(共有フォルダ)を扱う実務
記事「ネットワークドライブとUNCパスの落とし穴 ── 業務アプリでファイルサーバー(共有フォルダ)を扱う実務」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
業務アプリから共有フォルダーへ出力・監視するトラブルの多くは、コードのバグではなくWindowsの仕組みに根ざしている。ドライブ文字はログオンセッション単位のシンボリックリンクにすぎず、別ユーザー・UAC昇格・サービスからは見えないため、サービスや異なるセキュリティコンテキストのプロセスはUNCパスを使うべきとされる。サービスからの認証は実行アカウントで決まり、LocalSystem/NetworkServiceはコンピューターの資格情報、LocalServiceは匿名資格情報になるため、ドメイン環境ではドメインアカウントかgMSAに共有側の権限を与えるのが実務の標準になる。同じサーバーへの複数資格情報の同時接続はエラー1219で失敗する仕様があり、共有は遅い・切れる・いないことがあるという前提のもとtemp→renameでの公開やidempotencyな再処理、FileSystemWatcherとポーリングの併用で設計しておく必要がある。
flowchart LR
accTitle: ネットワークドライブとUNCパスの落とし穴の知識マップ
accDescr: ドライブ文字がログオンセッション単位でしか通用しないこと、サービスの実行アカウントごとに共有側の認証が変わること、エラー1219や共有の切断・取りこぼしを前提にした設計が必要になることの関係を示す図
unc_path["UNCパス"]
logon_session["ログオンセッション"]
mapped_network_drive["ネットワークドライブ(マップされたドライブ文字)"]
windows_service["Windowsサービス"]
uac_elevation["UAC昇格(管理者として実行)"]
enablelinkedconnections["EnableLinkedConnectionsレジストリ値"]
localsystem_account["LocalSystemアカウント"]
active_directory["Active Directory(AD DS)"]
networkservice_account["NetworkServiceアカウント"]
localservice_account["LocalServiceアカウント"]
gmsa["gMSA(group Managed Service Account)"]
domain_controller["ドメインコントローラー"]
domain_account["ドメインアカウント"]
kerberos["Kerberos"]
spn["SPN"]
network_redirector["ネットワークリダイレクター"]
smb_445["SMB(TCP 445)"]
net_use_command["net use コマンド"]
error_1219["エラー1219(ERROR_SESSION_CREDENTIAL_CONFLICT)"]
wnetaddconnection2["WNetAddConnection2"]
credential_manager["資格情報マネージャー(cmdkey)"]
impersonation["偽装(impersonation)"]
filesystemwatcher["FileSystemWatcher"]
smb_share_file_handoff["共有フォルダ(SMB)越しのファイル連携"]
polling_full_scan["定期フルスキャン(ポーリング)"]
temp_then_rename_publish["temp -> close -> rename/replaceでの公開"]
idempotent_processing["idempotency(冪等性)を前提にした処理"]
partial_write_read["書き込み途中ファイルの読み込み事故"]
file_exists_method["File.Exists"]
smb_autodisconnect["SMBのアイドル接続自動切断(autodisconnect)"]
mapped_network_drive -->|"に保存される"| logon_session
unc_path -->|"推奨される対応"| windows_service
mapped_network_drive -->|"用いるのは非推奨"| windows_service
windows_service -->|"前提とする"| logon_session
uac_elevation -.->|"両立しない"| mapped_network_drive
enablelinkedconnections -->|"用いるのは非推奨"| uac_elevation
unc_path -->|"推奨される対応"| uac_elevation
localsystem_account -.->|"前提とする"| active_directory
networkservice_account -.->|"前提とする"| active_directory
localservice_account -->|"用いるのは非推奨"| unc_path
gmsa -->|"推奨される対応"| windows_service
gmsa -->|"前提とする"| active_directory
gmsa -->|"前提とする"| domain_controller
domain_account -->|"推奨される対応"| windows_service
kerberos -->|"前提とする"| spn
kerberos -.->|"前提とする"| domain_controller
unc_path -->|"前提とする"| network_redirector
network_redirector -.->|"利用する"| smb_445
net_use_command -->|"前提とする"| unc_path
net_use_command -->|"原因になり得る"| error_1219
wnetaddconnection2 -->|"推奨される対応"| windows_service
credential_manager -.->|"推奨される対応"| unc_path
impersonation -->|"推奨される対応"| windows_service
filesystemwatcher -->|"推奨される対応"| smb_share_file_handoff
polling_full_scan -->|"推奨される対応"| filesystemwatcher
temp_then_rename_publish -->|"推奨される対応"| smb_share_file_handoff
idempotent_processing -->|"推奨される対応"| smb_share_file_handoff
temp_then_rename_publish -->|"防止する"| partial_write_read
file_exists_method -->|"用いるのは非推奨"| unc_path
smb_share_file_handoff -->|"前提とする"| unc_path
smb_share_file_handoff -.->|"原因になり得る"| smb_autodisconnect
概念間の関係(全31件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- ネットワークドライブ(マップされたドライブ文字)はログオンセッションに保存されます。
- UNCパスはWindowsサービスに対する本記事の推奨です。
- ネットワークドライブ(マップされたドライブ文字)をWindowsサービスに用いることは推奨されません。
- Windowsサービスはログオンセッションを前提とします。
- UAC昇格(管理者として実行)はネットワークドライブ(マップされたドライブ文字)と両立しません。
- EnableLinkedConnectionsレジストリ値をUAC昇格(管理者として実行)に用いることは推奨されません。
- UNCパスはUAC昇格(管理者として実行)に対する本記事の推奨です。
- LocalSystemアカウントはActive Directory(AD DS)を前提とします。
- NetworkServiceアカウントはActive Directory(AD DS)を前提とします。
- LocalServiceアカウントをUNCパスに用いることは推奨されません。
- gMSA(group Managed Service Account)はWindowsサービスに対する本記事の推奨です。
- gMSA(group Managed Service Account)はActive Directory(AD DS)を前提とします。
- gMSA(group Managed Service Account)はドメインコントローラーを前提とします。
- ドメインアカウントはWindowsサービスに対する本記事の推奨です。
- KerberosはSPNを前提とします。
- Kerberosはドメインコントローラーを前提とします。
- UNCパスはネットワークリダイレクターを前提とします。
- ネットワークリダイレクターはSMB(TCP 445)を利用します。
- net use コマンドはUNCパスを前提とします。
- net use コマンドはエラー1219(ERROR_SESSION_CREDENTIAL_CONFLICT)の原因になることがあります。
- WNetAddConnection2はWindowsサービスに対する本記事の推奨です。
- 資格情報マネージャー(cmdkey)はUNCパスに対する本記事の推奨です。
- 偽装(impersonation)はWindowsサービスに対する本記事の推奨です。
- FileSystemWatcherは共有フォルダ(SMB)越しのファイル連携に対する本記事の推奨です。
- 定期フルスキャン(ポーリング)はFileSystemWatcherに対する本記事の推奨です。
- temp -> close -> rename/replaceでの公開は共有フォルダ(SMB)越しのファイル連携に対する本記事の推奨です。
- idempotency(冪等性)を前提にした処理は共有フォルダ(SMB)越しのファイル連携に対する本記事の推奨です。
- temp -> close -> rename/replaceでの公開は書き込み途中ファイルの読み込み事故を防ぎます。
- File.ExistsをUNCパスに用いることは推奨されません。
- 共有フォルダ(SMB)越しのファイル連携はUNCパスを前提とします。
- 共有フォルダ(SMB)越しのファイル連携はSMBのアイドル接続自動切断(autodisconnect)の原因になることがあります。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。