Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

Windowsサービスで共有フォルダにアクセスするときのTips

スポンサードリンク

f:id:fa11enprince:20161015172759j:plain サービスからネットワーク越しの共有フォルダを覗きたいことがあるが
¥¥example.machine.local¥folder
のようなUNC(Universal Naming Convention)パスはプログラムからは使えない。
なのでネットワークドライブの割り当てをしたいと思うはず。

GUI(Explorer)からネットワークドライブの割り当てをしていてもWindowsサービス側では認識されない。

サービスで起動された実行ファイルから、ネットワークドライブが使えないのは何故? | ユニリタブログ

ユーザがデスクトップにログインした状態のときにエクスプローラなどで作成したネットワークドライブを使用している場合、その接続認証はユーザと紐付いているので、そのネットワークドライブは、ユーザが対話形式のログオンをしている状態でないと使用することができません。そのため、実行ファイルを呼び出しているサービスのアカウントにAdministrators権限があったとしても、対話形式のログオンをしている状態でない限り、デスクトップにログインした状態で作成したネットワークドライブを使うことはできません。

サービスで起動された実行ファイルから、ネットワークドライブにあるファイルを利用するには? | ユニリタブログ

ユーザが対話形式のログオンをしていないときに、サービスで起動された実行ファイルからネットワークドライブ上のファイルを扱うには、エクスプローラでネットワークドライブを設定する代わりに、net use コマンドを使用してネットワークドライブを設定します。

要は、ネットワークの接続が切れたときに再びnet useをやり直さないとつながらないが、Explorer上から設定してもダメということです。

windows - Map a network drive to be used by a service - Stack Overflow

解決策1.

nssmを使ってるならばサービスにするプログラムをbatでラップしてnet useする (ただし、これは接続断したらサービス再起動しないとダメ) 通常の用途ではこれで十分と思われる。

解決策2.

サービスの中のプログラムの中でnet useを実行する

解決策3.

タスクスケジューラ等でnet useを定期的にする

if not exist X: (
    X: \\example.machine.local\share
)

解決策4.

シンボリックリンクを使う

ただ、注意点がある

ファイル共有とシンボリックリンクの利用について – Ask the Network & AD Support Team

fsutilにて設定を変更する必要がある

measurement_pcは任意の名前にしてもらってよいです

管理者権限で実行 ネットワークドライブを消して、

net use X: /delete

シンボリックリンクを作成します。

mklink /D C:¥share \\example.machine.local\share