WindowsサービスアプリでAppData/Roamingにつくったファイルが見つからない

行先ボードアプリをサービス登録して実行させたのですが、
本来あると期待していた場所にファイルがない。
このアプリはAppDataのRoaming配下の行先ボード用フォルダにファイルを作成するハズだったのです。
PC内全てをファイル検索しても該当するファイル名がない。
ただ、サービスアプリは何故かファイルを認識してアプリに状態が反映されている。
不可解な現象。正直ホラーです。

僕はホラーが苦手です。
ちょっとこわくて泣きそうになりました。


結論から申し上げますと、
ファイルの置き場所が違ったのと
その置き場所に権限が必要で検索しても出てこないというだけの話でした。

サービスアプリでRoamingのフォルダを指定すると以下の場所になるようです。

C:\Windows\System32\config\systemprofile\AppData\Roaming

で、僕が必死で探してた場所は以下(こっちは間違い)

C:\Users\(ユーザー名)\AppData\Roaming

フォルダ全検索してファイルが見つからないのは
systemprofile以下に閲覧の許可が必要なため。

背景をもう少し知りたい方は以下をどうぞ。


以下の方法でサービスアプリを作成しています。

  • Visual Studio で開発
  • ワーカーサービスのテンプレートでIHostBuilderを用いてWindowsサービスアプリを作成
  • バッチファイルでサービス登録 + 起動
  • AppData/Roamingにファイルを出力

Roamingフォルダの指定方法(C#)

var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

サービスへ登録するバッチファイル

sc create DestinationBoardService binPath="%CUR_DIR%%APP_NAME%" start=auto

冷静に考えれば、ログインしなくても受け付けるサービスが
ユーザーのフォルダ配下で動作するわけがありません。
System32とかを疑っても良かったのですが、
以下の条件から途方にくれ幽霊のせいにしてビビってました。
僕は技術者なので安易にウィルスのせいにはしません。

  • 滅多にサービスアプリをつくらない
  • ブレークポイントを使ってデバッグできない
  • UIがない
  • 出力されているログファイルの場所がわからない
  • サービスの登録や解除が面倒くさい

結局、固定値でファイルパスを指定して出力したら普通に出ました。

var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
File.WriteAllText(@"C:\Work\test.txt", path);

// 出力結果:C:\WINDOWS\system32\config\systemprofile\AppData\Roaming

おわり

コメントする

メールアドレスが公開されることはありません。