WindowsマシンでSYSTEMとして実行されるコンポーネントを含むJavaアプリケーションがあります。Windows 7 x64では、jnidispatchライブラリを解凍しようとすると1つのコンポーネントが失敗します。
Exception in thread "main" java.lang.Error: Failed to create temporary file for
jnidispatch library: java.io.IOException: The system cannot find the path
specified
at com.sun.jna.Native.loadNativeLibraryFromJar(Native.java:600)
at com.sun.jna.Native.loadNativeLibrary(Native.java:550)
at com.sun.jna.Native.<clinit>(Native.java:87)
at falcon.util.vmware.VcmdTwo.loadLibraries(VcmdTwo.java:53)
以下にコピーされているのは、jnaライブラリのNativeクラスからのコメントの抜粋です。
JNAクラスがロードされると、ネイティブ共有ライブラリ(jnidispatch)もロードされます。{@link System#loadLibrary}を使用して、システムライブラリパスからロードしようとします。見つからない場合は、適切なライブラリがクラスパスから一時ディレクトリに抽出され、そこからロードされます。
OK、これまでのところ順調です。Javaは、java.io.tmpdirが指すものにjnidispatch.dllを解凍しようとしています。問題は、java.io.tmpdirがその特定のプロセスのC:\ Windows \ system32 \ config \ systemprofile \ AppData \ Local \Temp\を指していることのようです。このディレクトリが存在し、SYSTEMがフルコントロールを持っています。ただし、そのディレクトリへのjnidispatchDLLの抽出は常に失敗します。同じディレクトリにファイルを手動で書き込むようにアプリのコードを変更すると、書き込みは成功します。
関連するJavaおよびJDKコードを調べたところ、明らかな誤動作は見られなかったため、これはWin7 UACに関連する奇妙なバグであると結論付ける必要がありますが、それが何であるかを理解できれば気になります。どんな提案でも大歓迎です。