UACを使用してVistaでファイルの実際のパスを取得する方法は?
-
03-07-2019 - |
質問
CreateFile()を呼び出して、プログラムデータディレクトリにファイルを作成しています。 SHGetSpecialFolderPath()を使用してディレクトリ名を取得しています。
Vistaで、CreateFile()がエラー5(アクセス拒否)を返しているユーザーがいます。 CreateFile()が実際にファイルを作成しようとしている場所を知っていれば、彼のフォルダーのアクセス許可を確認できます。 Vista(UAC)の問題は、渡したディレクトリにファイルを作成しようとしていないことです。VirtualStoreディレクトリにある可能性もあります。追加の混乱の原因はこのユーザーがドイツ人であり、SHGetSpecialFolderPath()が" C:\ Program Data \ blah blah"を返していることです。パスとして、私はそれが実際にパスがあるとは思わないドイツ語Vistaでは、「プログラムデータ」にドイツ語を使用していると思います。ユーザーに"これが、ファイルを作成しようとしている正確なパスです。このフォルダの権限を確認してください。"
開いているファイルハンドルからパスを取得できることはわかっていますが、この場合はCreateFile()が失敗しているため、開いているハンドルはありません。 Vistaにファイルを作成しようとしている実際のパスを教えてもらうにはどうすればよいですか?
解決
プロセスモニターを起動して、その動作を確認します。 http://technet.microsoft.com/en-us/sysinternals/bb896645。 aspx
他のヒント
UACで使用されているパスが目的のパスでない場合、リダイレクトが有効になります。 リダイレクトが発生しないようにするには、マニフェストは、アプリケーションが適切にコーディングされ、アクセス制限を認識していることをVistaに示します(つまり、HKLMまたはプログラムフォルダに書き込みません。アプリを実行するのに管理者権限は不要です。
ただし、アプリケーションはAPPDATAフォルダーに書き込むことができるはずです(実際に使用する場合)。
CSIDL_COMMON_APPDATAではなくCSIDL_APPDATAを使用していることを確認してください(後者は管理者権限でのみアクセス可能です)。
実際のパス(予想されるパス)を見つけるには、エクスプローラーバーに%APPDATA%と入力する(またはWindows + Rを押してから%APPDATA%と入力して入力する)ようにユーザーに指示します。これにより、そのフォルダーのエクスプローラーが開きます。
VistaはProgramDataを使用してC:\ Program Files内に書き込もうとしたファイルを書き込みますが、管理者としてアプリを実行していない限り、プログラムファイル内に書き込めないため、失敗します。おそらく、現在のユーザーのAppDataフォルダーにファイルを保存してみてください。