none
GetEnvironmentVariable と 環境変数の "temp\1"の違い RRS feed

  • 質問

  • こんにちは。

    現在、既存のアプリがtemp フォルダに作成したファイルを読むように、新しいアプリを作成しているところです。

    マシンはWin2008R2で、VS2013と.net 4.5 で開発しています。VBの例で、

    Dim pathTemp As String = Environment.GetEnvironmentVariable("temp")

    という命令を実行すると

    C:\Users\(username)\AppData\Local\Temp

    という答えが得られるのですが、実際にファイルが配置されているのはSETコマンドによると

    TEMP=C:\Users\(username)\AppData\Local\Temp\1

    だということになっています。

    \1 については、リモートデスクトップなどで何人もが同一マシンにログインしていると数字が変わるので、タスクマネージャでいう「セッションID」に相当すると思うのですが、環境によっては\1が発生しません。以下は自分のクライアントPCでのSETの出力です。

    TEMP=C:\Users\(username2)\AppData\Local\Temp

    既存アプリはSETで得られる環境変数が指すテンポラリフォルダ、つまりtemp\1 などにファイルを発生させているのでこれを捕まえないと行けないのですが、.NET のAPIで、現在のセッションIDも含めた環境変数を取得するスマートな方法はないものでしょうか。

    PowerShell で類似の問題に遭遇して、こちらはWMIのクエリーをもとにセッションIDを得るというサンプルを見つけて解決したのですが、ここまで大げさな方法ではなく、setコマンドを叩いて文字列を切り出すような原始的な方法でもない、本来あるべきやり方があるのではないかと思うのですが、お知恵をお貸し下さい。

    よろしくお願いいたします。

    2015年1月28日 10:00

回答

すべての返信

  • .NETアプリとSETコマンドによる確認は同じセッションなのでしょうか? 質問文からは読み取れませんでした。

    RD セッション ホスト サーバー用の一時フォルダーを構成するにあるように、設定によってはRDP接続中は環境変数にセッションIDを付けることが可能です。その際、.NETアプリでもSETコマンドと同じ値が得られると思っていましたが…。

    • 回答としてマーク 星 睦美 2015年2月18日 5:27
    2015年1月28日 11:12
  • こんにちは、お返事ありがとうございました。

    どうも条件が判らないまま解決してしまいました。昨日まで試行錯誤していた段階では、同じセッション内VS2013のデバッガーとcmdで違う答えが出ていたのですが、今日やりなおして見るとVSのデバッガーでも\1 が付いた価が返ってきてしまいました。

    ゆうべ、質問投稿後に Process.GetCurrentProcess().SessionId というヒントを見つけたので、これを後ろにくっつけるようにしてみたらうまく動いたのですが、今朝になってみると、temp\1\1 というパスを生成して失敗するようになっていました…。法則性がはっきりしなくて気持ち悪いですが、佐祐理さんのコメントの通り「NETアプリでもSETコマンドと同じ値が得られる」のが正常な状態だという前提で、再発しないか様子を見てみようと思います。

    2015年1月29日 4:02
  • 追記です。

    今日、新しいデバッグ環境で再度このAPIとコマンドプロンプトでtempの値が違う現象を見ることができました。当該環境のOSを再起動すると、両方¥1がついて一致するようになりました。解消法だけははっきりしたようです。

    2015年3月25日 9:30