ネットワークドライブとUNCパスの落とし穴 ── 業務アプリでファイルサーバー(共有フォルダ)を扱う実務

· · ネットワークドライブ, UNCパス, SMB, ファイル共有, Windowsサービス, ファイルサーバー, C#, .NET, ネットワーク, 不具合調査, Windows開発, 技術相談

「開発機では動いていたのに、お客様の環境で『Z:\ が見つかりません』と言われる」「タスクスケジューラに載せた途端、共有フォルダへの出力が失敗するようになった」「Windowsサービス化したらファイルサーバーが見えなくなった」── 業務アプリの相談で、ファイルサーバー(共有フォルダ)絡みのトラブルは定番中の定番です。受注データの取り込み、帳票やCSVの出力、装置が吐くファイルの監視。オンプレの業務システムでは、共有フォルダは今も現役の連携基盤だからです。

厄介なのは、この種のトラブルの多くが「コードのバグ」ではなく、ドライブ文字とログオンセッションの関係、サービスの実行アカウントと認証、SMBの接続管理といったWindows側の仕組みに根ざしていることです。デバッガーで追っても原因にたどり着けず、「自分のPCでは再現しない」まま時間が溶けていきます。

この記事では、共有フォルダへのファイル出力・取り込み・監視を実装する業務アプリ開発者(WinForms/WPF/Windowsサービス)を対象に、ネットワークドライブとUNCパスの落とし穴を仕組みから整理し、実務の定石を判断表にまとめます。

1. まず結論

  • ドライブ文字(Z:など)はシステム全体のものではなく、ログオンセッション単位のものです。ログオンセッションごとにAからZのドライブ文字一式が割り当てられるため、別ユーザーのプロセス、別のログオンセッションで動くサービスからは、ユーザーがマップしたドライブは見えません。1
  • UACが有効な管理者では、通常権限と昇格用の2つのログオンセッションが作られ、ドライブマップ(DosDevicesのシンボリックリンク)はセッションごとに独立します。だから「昇格したアプリからだけZ:が見えない」が起きます。EnableLinkedConnections レジストリで両セッションに共有させる回避策は存在しますが、Microsoftが「システムを安全でなくする可能性があり、サポートしない」と明記する非サポート設定です。23
  • サービス(や異なるセキュリティコンテキストのプロセス)からリモート資源にアクセスするときは、UNCパス(\\server\share\...)を使うのが公式の指針です。サービス内から net use やWNet系APIでドライブ文字をマップする実装は、資格情報の漏えいやサービス間の干渉の観点から推奨されていません。1
  • 共有側で権限を与える相手は、サービスの実行アカウントで決まります。LocalSystemとNetworkServiceはネットワーク上では「コンピューターの資格情報」として認証され、LocalServiceは匿名資格情報になるため共有アクセスには不適です。ローカルユーザーアカウントのサービスはネットワーク資源にアクセスできません。実務の本命はドメインアカウントか、パスワード管理をOSに任せられるgMSAです。45678
  • 同じサーバーに対して複数の資格情報で同時接続はできません。2つ目の接続はエラー1219(ERROR_SESSION_CREDENTIAL_CONFLICT)で失敗し、これは仕様(by design)です。910
  • 共有フォルダは「遅い・切れる・いないことがある」が正常系です。アイドルな接続は既定で15分後にサーバー側から切断されます(次のアクセスで再接続)。File.Exists は権限不足やエラー時にも例外を出さず false を返すため、「ファイルが無い」と「サーバーに届かない」を区別できません。1112
  • FileSystemWatcherはネットワークドライブやリモートコンピューターの監視をサポートしますが、取りこぼし前提で設計します。バッファあふれでイベントを失うことがあり、ネットワーク越しの監視では内部バッファの上限が64KBに制限されます。ポーリング(フルスキャン)の併用が定石です。13

2. ドライブ文字とUNCパスの関係 ── Z:は「あなたのログオンセッション」のもの

エクスプローラーで \\fileserver\share をZ:に割り当てると、いかにもマシン全体に「Z:ドライブ」が生えたように見えます。これが最初の誤解です。

公式ドキュメントの記述は明快です。ドライブ文字はシステムグローバルではなく、ログオンセッションごとにAからZの一式が割り当てられます。リダイレクトされたドライブ(ネットワークドライブ)は異なるユーザーアカウントで動くプロセス間で共有できず、別のログオンセッションで動くサービスは、他のセッションで確立されたドライブ文字にアクセスできません。1 システムはドライブマップを、ログオンセッションを一意に識別するログオンSIDに基づいて管理しています。1

つまりZ:は「パスの短縮記号がログオンセッションに1セットずつある」だけで、実体は常にUNCパスです。ここから、現場で頻発する症状が芋づる式に説明できます。

症状 仕組み上の理由
別ユーザーで実行したらZ:が無い ドライブ文字はログオンセッション単位。他人のマップは見えない1
「管理者として実行」するとZ:が無い UACで通常用と昇格用の2つのログオンセッションが作られ、マップは共有されない2
タスクスケジューラ/サービスに載せたらZ:が無い 別のログオンセッションで実行されるため。サービスをユーザーアカウントで構成しても、システムはサービス用に新しいログオンセッションを作る1

UACの件はもう少し詳しく押さえておく価値があります。管理者グループのユーザーがログオンすると、システムは権限を制限したトークンと完全な管理者トークンの、リンクされた2つのログオンセッションを作ります。ドライブマップの実体はドライブ文字とUNCパスを対応付けるシンボリックリンクオブジェクト(DosDevices)で、これはログオンセッション固有であり、セッション間で共有されません。2 ログオンスクリプトは通常権限側で走るので、昇格したプロセスからはそのマップが見えない、という理屈です。

EnableLinkedConnections(HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System のDWORD値)を1にすると、リンクされた2つのセッションの両方にシンボリックリンクが書き込まれ、この症状は消えます。ただし公式ドキュメントには「この回避策はシステムを安全でなくする可能性がある。Microsoftはこの回避策をサポートしない。自己責任で使用すること」と明記されています。3 お客様環境のレジストリに非サポート設定を仕込む提案は、業務アプリの解決策としては筋が悪い。アプリ側をUNCパスで書くのが正道です。フォルダーリダイレクトの公式トラブルシューティングでも「ドライブ文字ではなく常にUNCパスの使用を推奨する」とされています。3

実装上はシンプルで、設定ファイルに保存するパスをUNCで持てば済みます。

// appsettings.json ── ドライブ文字ではなくUNCで持つ
{
  "FileTransfer": {
    "IncomingDir": "\\\\fileserver01\\edi\\incoming",
    "ProcessedDir": "\\\\fileserver01\\edi\\processed"
  }
}

ユーザーがフォルダー選択ダイアログでZ:配下を選べてしまうアプリなら、保存時にUNCへ正規化しておくと、後で実行コンテキストが変わっても壊れません。ドライブ文字からUNCへの変換には WNetGetUniversalName というAPIが用意されています。14

3. Windowsサービスから共有フォルダにアクセスする ── UNC必須、そして「誰として」アクセスするか

前章のとおり、サービスからマップドドライブは使えません。公式ドキュメントは、サービス(および異なるセキュリティコンテキストで動くプロセス)はUNC名でリモート資源にアクセスすべきとしたうえで、サービス内で net use やWNet系APIを使って実行時にドライブ文字をマップする実装を明確に非推奨としています。同じコンテキストで動く他のサービスからマップが見えてしまう、net use に渡した資格情報がサービスの境界外に漏れうる、複数サービスが同じマップを張ろうとして「既に接続済み」エラーで干渉する、というのが挙げられている理由です。1

UNCパスにしたら次の問題は認証です。サービスは「誰として」ファイルサーバーにアクセスするのか。これは実行アカウントで決まり、共有側で権限を与えるべき相手もこれで決まります。

実行アカウント ネットワーク上の身元 共有側の権限付与 判断
LocalSystem コンピューターの資格情報4 ドメイン環境ならコンピューターアカウント(DOMAIN\MACHINE$)に共有・NTFS権限 動くが権限が過大。マシン入替で権限設定やり直し
NetworkService コンピューターの資格情報5 同上 ローカル権限は最小でネットワーク上はLocalSystemと同じ身元
LocalService 匿名資格情報6 付与しようがない 共有アクセスには不適
ローカルユーザー ネットワーク資源にアクセス不可7
ドメインユーザー そのアカウント そのアカウントに付与 実務の標準。パスワード変更の運用が課題
gMSA そのアカウント そのアカウントに付与 パスワードはOSが自動管理(30日ごとに自動変更)。対応環境なら本命815

LocalSystemとNetworkServiceが「コンピューターとして」ネットワークに出ていくのは公式に明記された仕様です。45 BITSのドキュメントには、この帰結として「ソースファイルのACLがユーザーアカウントにアクセスを制限している場合、(コンピューター資格情報で認証される)サービスはアクセス拒否になる」「システムアカウントはマップドドライブを使うべきではない」という実務的な注意がそのまま書かれています。16

ここから導ける実務の指針は次の3つです。

  • 「サービスにしたらアクセス拒否」の一次切り分けは、実行アカウントの確認です。デスクトップで動いていたときは「あなた」の権限、サービスでは上表の身元でアクセスチェックされます。共有のアクセス許可とNTFSのACLの両方を、その身元に対して確認します。
  • ドメイン環境で長期運用するなら、ドメインアカウントかgMSAを実行アカウントにします。gMSAは240バイトのランダムパスワードを30日ごとにOSが自動更新するため、「サービスアカウントのパスワード期限切れで月曜の朝に全部止まった」類の事故を構造的に消せます。15
  • ワークグループ環境(ドメインなし)では、コンピューター資格情報での認証が成立しないため、次章の明示的な資格情報の出番になります。

サービス自体の作り方(実行アカウントの設定、回復オプション、安全な停止)は「Windowsサービスの作り方と運用」で、セッションとログオンの仕組みは「Windowsのセッション分離をどう理解するか」で整理しています。

4. 資格情報の扱い ── net use・資格情報マネージャー・エラー1219

実行アカウント自体に共有側の権限を与えられない場合(ワークグループ、NASが独自アカウント制の場合など)は、明示的に資格情報を渡して接続することになります。手段は主に3つです。

  • net use \\server\share /user:... ── そのログオンセッションに接続を確立します。対話的な確認には便利ですが、前章のとおりサービス内での実行は非推奨です。1
  • 資格情報マネージャー(cmdkey) ── cmdkey /add:server /user:svc-file /pass:... で保存しておくと、以後そのサーバーへの認証時に保存済み資格情報が自動的に使われます。1718 保存はユーザープロファイル単位なので、サービスで使うなら「サービスの実行アカウントのコンテキストで」登録する必要がある点が落とし穴です。
  • プログラムからの接続(WNetAddConnection2) ── クライアントの資格情報を指定してネットワーク資源への接続を確立できます。公式ドキュメントでも、サーバープロセスがネットワーク資源にアクセスする戦略の一つとして挙げられています。19 ドライブ文字を割り当てない「deviceless接続」にすれば、UNCパスのままアクセスできます。

そして、この領域でもっとも有名な罠がエラー1219です。

Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. (ERROR_SESSION_CREDENTIAL_CONFLICT, 1219)10

同じサーバーに対して、同じログオンセッションから異なるユーザー名で複数の接続を張ることはできません。「営業共有は自分のアカウント、システム連携用の共有は専用アカウントで」と同じファイルサーバーに2種類の資格情報で繋ごうとすると、2つ目が1219で失敗します。公式ドキュメントはこれを「by design(仕様)」と明言しており、回避策として挙げられているのは「IPアドレスで接続する」「別のDNSエイリアスを作って接続する」── つまり別のサーバーに見せかける方法です。9

実務では、そもそも1台のサーバーに複数の資格情報を使い分ける構成を避けるのが第一選択です。連携用アカウントを1つに集約し、必要な共有すべてにそのアカウントの権限を付ける。それができない事情がある場合に限り、別名(エイリアス)で経路を分けます。

ただし、別名は「DNSにCNAMEを1行足せば終わり」ではありません。Kerberos認証の環境では、SMBクライアントは接続先の名前に対応するSPN(サービスプリンシパル名)で認証しようとするため、エイリアスに対するSPNが登録されていないとCNAME経由のアクセス自体が失敗することがあります。公式のトラブルシューティングもこのSPN欠落を原因の一つに挙げ、DNSのCNAMEではなく netdom computername <サーバー名> /add:<別名> でコンピューター名の別名として構成する方法を案内しています。20 エイリアス経由の接続は、1219対策として設計に組み込む前に必ず対象環境で動作検証してください。

なお「サービスが、接続してきたクライアントユーザーの権限でファイルサーバーにアクセスしたい」という高度な要件は、資格情報の使い回しではなく偽装(impersonation)の領域です。公式ドキュメントもサービスが資格情報を抱え込むより偽装を推奨しています。1 偽装の正しい書き方と、リモート資源で追加の考慮が必要になる点は「Windowsの偽装トークンを正しく扱う」を参照してください。

5. 「遅い・切れる・いないことがある」を前提に設計する

ローカルディスクと同じ感覚で書いたコードは、共有フォルダ相手では必ずどこかで事故ります。前提にすべき現実は3つです。

第一に、接続は切れるのが正常です。アイドル状態の接続は、サーバー資源の浪費を防ぐため既定で15分のタイムアウト後に切断されます。エクスプローラーのネットワークドライブに赤い×が付くお馴染みの現象がこれで、次にアクセスすれば速やかに再接続されます。11 つまり「たまにしかアクセスしない業務アプリが、アクセスのたびに一瞬待たされる」「監視ツールが『切断された!』と騒ぐが実害はない」のはどちらも仕様どおりの動きです。接続の存在を監視するのではなく、実際のI/Oが成功するかで判断します。

第二に、エラーの出方が不親切です。File.Exists は、パスが不正でも、権限が足りなくても、ディスク障害でも、例外を出さずに false を返します。12 ローカルでは「falseなら無い」でほぼ困りませんが、共有相手では「ファイルが無い」と「サーバーに届かない/権限が無い」がすべて false に潰されるため、Existsで分岐して業務判断をするコードは、ネットワーク障害時に『対象なし』として正常終了するという嫌な壊れ方をします。存在確認を挟まず開きにいって例外で区別する方が、共有相手では診断しやすい設計です。

第三に、相手はまだいないことがあります。マシン起動直後はネットワークの準備よりサービスの起動が先行することがありますし、ファイルサーバー側が再起動中かもしれません。持続的接続(persistent connection)はユーザーのログオン時に復元される仕組みなので21、ログオンを経ないサービスの世界では「起動したら共有が見える」ことに保証はありません。起動時に一度だけ疎通確認して失敗したら終了、ではなく、リトライしながら待つのが正しい振る舞いです。

この3つを織り込むと、書き込み側の骨格はこうなります。

// 一時的なネットワークエラーはリトライ、業務エラーは即時失敗させる
private static async Task WriteToShareAsync(string finalPath, byte[] content, CancellationToken ct)
{
    var dir = Path.GetDirectoryName(finalPath)!;
    var tempPath = Path.Combine(dir, $"~{Guid.NewGuid():N}.tmp");

    try
    {
        for (var attempt = 1; ; attempt++)
        {
            try
            {
                await File.WriteAllBytesAsync(tempPath, content, ct);
                File.Move(tempPath, finalPath); // 同一ディレクトリ内のrenameで「完成」を公開
                return;
            }
            catch (IOException ex) when (attempt < 5 && IsRetryable(ex))
            {
                // 一時的なネットワーク障害だけを指数バックオフで再試行(上限つき)
                _logger.LogWarning(ex, "共有への書き込み失敗({Attempt}回目)。再試行します", attempt);
                await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)), ct);
            }
        }
    }
    catch
    {
        // 諦めて例外を伝播させるときは、一時ファイルをベストエフォートで掃除する
        try { File.Delete(tempPath); } catch { /* 掃除の失敗は握りつぶす */ }
        throw;
    }
}

// IOExceptionは「ネットワーク切断」も「移動先に同名ファイルあり」も「ディスク満杯」も同じ型で飛んでくる。
// HResultの下位16bit(Win32エラーコード)で、再試行に意味がある一時的な障害だけを選ぶ
private static bool IsRetryable(IOException ex)
{
    var win32 = ex.HResult & 0xFFFF;
    return win32 is 53   // ERROR_BAD_NETPATH: ネットワークパスが見つからない
              or 59   // ERROR_UNEXP_NET_ERR: 予期しないネットワークエラー
              or 64   // ERROR_NETNAME_DELETED: ネットワーク名が利用できなくなった
              or 121; // ERROR_SEM_TIMEOUT: タイムアウト(いわゆるセマフォタイムアウト)
}

「IOExceptionならリトライ」と雑に書かないことも重要です。移動先に同名ファイルがある、パスが長すぎる、ディスクが満杯といった何度やっても結果が変わらない失敗も同じIOExceptionで届くため、例外の型だけで判定すると、恒久的なエラーを5回リトライして無駄にバックオフで待つことになります。上の例のように、Win32エラーコード(53/59/64/121など、共有アクセスの切断・タイムアウト系22)で「再試行に意味がある失敗」だけを選別してください。実環境のログで観測したコードを足していく運用が現実的です。

ポイントは、リトライを付けることそのものより、リトライしても安全な受け渡しプロトコル(temp -> rename、idempotency)とセットにすることです。書き込み途中で切断されたら中途半端なファイルが残ります。final名は「閉じてからのrename」でしか現れない約束にしておけば、受信側が生焼けのファイルを読む事故を防げます。なお、プロセスのクラッシュや電源断ではコード内の掃除自体が走らないので、受け渡しフォルダには「~*.tmp のうち一定時間更新のないものを削除する」定期清掃も併せて用意しておくと、ゴミの蓄積で詰まりません。この受け渡し設計の全体像は「ファイル連携の排他制御の基礎知識」にまとめています。

もう一つ、ネットワーク相手特有の注意があります。「失敗した」という結果は、本当に失敗したことを保証しません。サーバー側でrenameが完了した直後に接続が切れると、クライアントには例外が返るのに、final名のファイルはすでに公開されている、という状態が起こり得ます。このまま何も考えずに再試行すると、「移動先にすでに同名ファイルがある」エラーで詰まるか、受信側がすでに1つ目を取り込んでいた場合には同じデータを二重に公開してしまいます。対策は、rename段の失敗を再試行する前に移動先の状態を確認して突き合わせることです。final名に処理ID(伝票番号や実行GUID)を含めておけば、「同じIDのfinalファイルがすでに存在する=前回のrenameは実は成功していた」と判定して成功扱いで抜けられますし、受信側もIDの重複で二重取り込みを弾けます。

6. SMB越しの排他制御とFileSystemWatcherの信頼性

6.1. ロックへの過信は禁物

共有フォルダは複数のクライアントから同時に触られます。FileShare.None で開けば開いている間の排他はSMB越しでも機能しますが、「ロックが取れたら安全」に寄りかかった設計は、切断でハンドルが失われたとき、ロックを取らない相手(手作業のコピー、他システム)が混ざったときに崩れます。排他の本体はOSのロックではなく、temp -> rename・原子的claim(incomingからprocessingへのrename勝者だけが処理する)・idempotencyという受け渡しプロトコル側に置くべきです。考え方の詳細は上掲の排他制御の記事に譲ります。

6.2. FileSystemWatcherをリモート共有で使うときの現実

FileSystemWatcher は、ローカルだけでなくネットワークドライブやリモートコンピューター上のファイル監視をサポートすると公式に明記されています。13 使うこと自体は正当です。ただし信頼性の前提が2つあります。

  • 通知はバッファ経由であり、あふれれば取りこぼします。変更が短時間に集中するとバッファサイズを超えた分のイベントは失われます。13
  • ネットワーク越しの監視では InternalBufferSize の上限が64KBに制限されます。ローカルより「盛れない」制約が明文化されています。13

さらに、共有の向こう側でサーバーの再起動や切断が起きたとき、監視が黙って死んでいるだけで通知が来ない、という症状は不具合調査の現場で繰り返し見てきました。リモート共有のFileSystemWatcherは「気づくのを早くするためのヒント」と割り切り、起動時・エラー時・定期のフルスキャン(ポーリング)を真実の源にするのが実務の結論です。イベントの重複・順序の崩れへの対処も含めた設計パターンは「FileSystemWatcher実務ガイド」で詳述しています。

7. 実務の定石(判断表)

ここまでの内容を、設計時に迷う論点ごとの判断表にまとめます。

論点 選択肢 判断の目安
パスの持ち方 ドライブ文字 / UNCパス アプリが扱うパスは常にUNC。ドライブ文字はユーザーの画面上の便宜と割り切る1
共有への書き込み 直書き / temp -> rename 直書きは「途中のファイルを読まれない」保証がない。final名=完成の約束が基本
新着ファイルの検知 FileSystemWatcher単独 / ポーリング / 併用 リモート共有では取りこぼし前提。数分間隔で許されるならポーリングだけの方が単純で堅い。即時性が必要なら併用13
サービスの実行アカウント LocalSystem / ドメインアカウント / gMSA 共有アクセスがあるならドメインアカウントかgMSA。gMSAが使える環境ならパスワード運用ごと消せる8
資格情報が別に必要なとき net useをコードで叩く / WNetAddConnection2 / cmdkey事前登録 サービス内のnet useは非推奨。同一サーバーへの複数資格情報は1219で詰むので、アカウント集約かDNSエイリアスで設計段階から回避19
クライアント多数からの直アクセス 各端末がUNC直 / 中間サービス(API)経由 端末台数×資格情報×同時アクセスが管理しきれなくなったら、共有を触るのは1つのサービスに集約し、クライアントはAPIで話す構成に寄せる

最後の行は補足しておきます。共有フォルダ連携は手軽ですが、アクセス元が増えるほど「誰がどの権限で」「誰と誰が競合するか」の管理が指数的に難しくなります。ある規模を超えたら、ファイルサーバーに触るプロセスをWindowsサービス1本に集約し、各クライアントとはHTTPやgRPCで会話する。共有フォルダを「システム間のインターフェース」から「そのサービスの内部実装」に格下げするのが、長期的にもっとも保守しやすい形です。

8. まとめ

  • ドライブ文字はログオンセッション単位の記号にすぎません。別ユーザー・昇格プロセス・サービスから見えないのは仕様であり、アプリはUNCパスで書くのが正道です。EnableLinkedConnections は非サポートの回避策です。
  • サービスからの共有アクセスはUNC必須。誰として認証されるかは実行アカウントで決まり、LocalSystem/NetworkServiceはコンピューター資格情報、LocalServiceは匿名です。実務はドメインアカウントかgMSAに共有側の権限を与えます。
  • 同一サーバーへの複数資格情報の同時接続はエラー1219で失敗します(仕様)。アカウント集約かDNSエイリアスで設計段階から回避します。
  • 共有は「遅い・切れる・いないことがある」が正常系。アイドル切断(既定15分)は異常ではなく、File.Exists のfalseはネットワーク障害と区別できません。リトライとtemp -> rename、idempotencyをセットで入れます。
  • FileSystemWatcherはリモート監視をサポートしますが、バッファあふれによる取りこぼしと64KB上限があるため、フルスキャンの併用が定石です。
  • 迷ったら第7章の判断表へ。規模が育ったら、共有を触るプロセスを中間サービスに集約する構成も検討してください。

関連記事

関連する相談領域

合同会社小村ソフトでは、共有フォルダを介したファイル連携システムの設計・実装、Windowsサービス化に伴うアクセス権・認証まわりの構成検討、「サービスにしたら共有が見えない」「特定環境でだけ失敗する」といった不具合の調査を扱っています。

参考リンク

  1. Microsoft Learn, Services and Redirected Drives. ドライブ文字がシステムグローバルではなくログオンセッションごとに割り当てられること、サービスは他セッションのドライブ文字にアクセスできずUNC名を使うべきこと、サービス内でのnet use・WNet関数によるドライブマップが非推奨である理由(資格情報の漏えい、サービス間の干渉など)、ユーザーアカウントで構成したサービスにも新しいログオンセッションが作られること、資格情報の抱え込みよりクライアント偽装が推奨されることについて。  2 3 4 5 6 7 8 9 10 11

  2. Microsoft Learn, Mapped drives are not available from an elevated prompt when UAC is configured to Prompt for credentials. UAC有効時にリンクされた2つのログオンセッションが作られること、ドライブマップの実体がログオンセッション固有のシンボリックリンクオブジェクト(DosDevices)でありセッション間で共有されないこと、EnableLinkedConnectionsが両セッションへのシンボリックリンク書き込みを強制することについて。  2 3

  3. Microsoft Learn, Folder Redirection fails to apply when redirected to mapped drive letter, instead of UNC path. 管理者ログオン時にLSAが2つのアクセストークンを作り標準トークンでドライブがマップされること、EnableLinkedConnectionsレジストリ値の設定手順と「システムを安全でなくする可能性があり、Microsoftはサポートしない」という警告、ドライブ文字ではなくUNCパスの使用が常に推奨されることについて。  2 3

  4. Microsoft Learn, LocalSystem Account. LocalSystemがローカルで広範な特権を持ち、ネットワーク上ではコンピューターの資格情報をリモートサーバーに提示することについて。  2 3

  5. Microsoft Learn, NetworkService Account. NetworkServiceがローカルでは最小限の特権を持ち、ネットワーク上ではコンピューターの資格情報をリモートサーバーに提示することについて。  2 3

  6. Microsoft Learn, LocalService Account. LocalServiceがネットワーク上では匿名資格情報を提示することについて。  2

  7. Microsoft Learn, About Service Logon Accounts. サービスのログオンアカウントが実行時のセキュリティコンテキストを決めること、ローカルユーザーアカウントのセキュリティコンテキストで動くサービスがネットワーク資源にアクセスできないことについて。  2

  8. Microsoft Learn, Group Managed Service Accounts overview. gMSAが自動パスワード管理とSPN管理の簡素化を提供するドメインアカウントであり、パスワード管理をWindows OSに任せられることについて。  2 3

  9. Microsoft Learn, The network folder specified is currently mapped using a different user name and password error. 同一サーバーへ異なる資格情報で複数接続しようとしたときのエラーがby design(仕様)であること、回避策がIPアドレス接続または別のDNSエイリアスの作成であることについて。  2 3

  10. Microsoft Learn, System Error Codes (1000-1299). エラー1219(ERROR_SESSION_CREDENTIAL_CONFLICT)の定義とメッセージについて。  2

  11. Microsoft Learn, Mapped drive connection to network share may be lost. アイドル接続が既定で15分のタイムアウト後に切断されること(autodisconnect)、エクスプローラーのドライブアイコンに赤い×が表示されるがアクセスすれば速やかに再接続されることについて。  2

  12. Microsoft Learn, File.Exists(String) Method. 読み取り権限がない場合に例外を出さずfalseを返すこと、存在判定中に何らかのエラーが発生した場合(無効なパス、ディスク障害、権限不足など)もfalseを返すことについて。  2

  13. Microsoft Learn, FileSystemWatcher Class. ローカルコンピューター・ネットワークドライブ・リモートコンピューター上のファイル監視をサポートすること、バッファサイズ超過時にイベントを取りこぼしうること、ネットワーク越しの監視ではInternalBufferSizeの最大値が64KBであることについて。  2 3 4 5

  14. Microsoft Learn, WNet Functions. WNetGetUniversalNameがドライブベースのパスからユニバーサル(UNC)形式の名前を取得する関数であることについて。 

  15. Microsoft Learn, Secure group managed service accounts. gMSAのパスワードが240バイトのランダム生成であり、OSが30日ごとに自動変更するため管理者によるパスワード変更の計画やサービス停止が不要になることについて。  2

  16. Microsoft Learn, Service Accounts and BITS. LocalSystem/NetworkServiceのネットワーク認証がコンピューター資格情報、LocalServiceが匿名資格情報で行われること、ACLがユーザーアカウントに限定されている場合にアクセス拒否となること、システムアカウントがマップドドライブを使うべきでないことについて。 

  17. Microsoft Learn, cmdkey. cmdkeyコマンドで保存済みユーザー名とパスワード(資格情報)を作成・一覧・削除できることについて。 

  18. Microsoft Learn, Credentials processes in Windows authentication. 資格情報マネージャーが資格情報をWindows資格情報コンテナーに保存し、次回以降の認証時に自動的に提示することについて。 

  19. Microsoft Learn, Client Access to Network Resources. サーバープロセスがネットワーク資源にアクセスする戦略として、クライアントの資格情報を指定したWNetAddConnection2による接続確立が挙げられていることについて。 

  20. Microsoft Learn, SMB file server share access is unsuccessful through DNS CNAME alias. CNAME経由のSMBアクセスが失敗する原因の一つがエイリアスに対するSPN未登録であること、DNSのCNAMEではなくnetdom computernameコマンドで別名を定義する方法が案内されていることについて。 

  21. Microsoft Learn, Windows Networking Operations. 持続的接続(persistent connection)がユーザーのログオン時にシステムによって自動復元されるネットワーク接続であることについて。 

  22. Microsoft Learn, System Error Codes (0-499). ERROR_BAD_NETPATH(53)、ERROR_UNEXP_NET_ERR(59)、ERROR_NETNAME_DELETED(64)、ERROR_SEM_TIMEOUT(121)の各定義について。 

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

自社開発のWindowsアプリがウイルス扱いされたら ── Microsoft Defenderの誤検知対応と、性能影響との付き合い方

配布した自社開発のWindowsアプリがMicrosoft Defenderにウイルスとして検知・隔離されたときの正規の対処を整理します。機械学習・クラウド保護・レピュテーションという現代のウイルス対策の仕組み、Microsoftへの誤検知報告(ファイル申請)、隔離からの復...

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

この記事は次のサービスページにつながります。近い入口からご覧ください。

よくある質問

この記事のテーマについて、相談時によくある質問をまとめています。

Windowsサービスからネットワークドライブ(Z:)にアクセスできないのはなぜですか?
ドライブ文字がシステム全体のものではなく、ログオンセッション単位のものだからです。ユーザーがエクスプローラーでマップしたZ:は、そのユーザーのログオンセッションに属する記号でしかなく、別のログオンセッションで動くサービスからは見えません。サービスがユーザーアカウントで動く場合でも、システムはサービス用に新しいログオンセッションを作るため、同じアカウントでもデスクトップ側のマップは引き継がれません。サービスからは\\server\shareのUNCパスでアクセスするのが正解です。
LocalSystemで動くサービスから共有フォルダにアクセスするには?
LocalSystemはネットワーク上ではコンピューターの資格情報として認証されます。ドメイン環境であれば、共有側(共有のアクセス許可とNTFSのACL)にそのマシンのコンピューターアカウント(DOMAIN\MACHINE$)への権限を付与すればアクセスできます。ただしマシンを入れ替えると権限設定がやり直しになるなど運用しづらいため、実務ではサービスの実行アカウントをドメインアカウントかgMSA(グループ管理サービスアカウント)にして、そのアカウントに共有側の権限を与える構成を推奨します。
共有フォルダ上のファイルをFileSystemWatcherで監視してよいですか?
使えますが、単独では信頼しないでください。FileSystemWatcherはネットワークドライブやリモートコンピューター上の監視をサポートしますが、変更通知はバッファ経由で届くため、通知が集中するとバッファがあふれてイベントを取りこぼします。しかもネットワーク越しの監視ではバッファの上限が64KBに制限されます。通知は「再スキャンのきっかけ」として扱い、起動時・エラー時・定期のフルスキャン(ポーリング)を必ず併用するのが定石です。
ネットワーク切断に強いファイル連携にするにはどうすればよいですか?
「共有は遅い・切れる・いないことがある」を正常系として設計します。具体的には、書き込みは一時ファイル名で行いclose後にリネームして公開する(temp -> rename)、読み書きはリトライで包み、一時的なネットワークエラーと業務エラーを区別して扱います。File.Existsはアクセスできない場合もfalseを返すため「ファイルが無い」と「サーバーに届かない」を区別できない点に注意し、再処理しても壊れないidempotencyな処理にしておくことが最後の砦になります。

著者プロフィール

記事の著者プロフィールページです。

小村 豪

合同会社小村ソフト 代表

Windows ソフト開発、技術相談、不具合調査を中心に、既存資産が残る案件や原因が見えにくい障害調査に強みがあります。

ブログ一覧に戻る