1

CreateFile() を呼び出して、Program Data ディレクトリにファイルを作成しています。ディレクトリ名を取得するために SHGetSpecialFolderPath() を使用しています。

CreateFile() がエラー 5 (アクセスが拒否されました) を返す Vista のユーザーがいます。CreateFile() が実際にファイルを作成しようとした場所を知っていれば、フォルダーのアクセス許可を確認できるので助かります。Vista (UAC) の問題は、渡されたディレクトリにファイルを作成しようとしていないことです。VirtualStore ディレクトリにある可能性もあります。追加の混乱の原因は、このユーザーがドイツ人であることです。SHGetSpecialFolderPath() はパスとして「C:\Program Data\blah blah」を返しますが、パスが実際にどこにあるかはわかりません。ドイツ語の Vista では、「プログラム データ」のドイツ語を使用していると思います。ユーザーに「これは、ファイルを作成しようとしている正確なパスです。このフォルダーに対するアクセス許可を確認してください。」

開いているファイル ハンドルからパスを取得できることはわかっていますが、この場合は CreateFile() が失敗しているため、開いているハンドルがありません。ファイルを作成しようとしている実際のパスを Vista に教えてもらうにはどうすればよいですか?

4

3 に答える 3

2

Process Monitor を起動して、その動作を確認します: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

于 2009-01-05T17:52:24.020 に答える
1

UAC を使用する場合、使用するパスが必要なパスではない場合、リダイレクトが有効になります。リダイレクトが発生しないようにするには、マニフェストをアプリケーションに追加します。このマニフェストは、アプリケーションが適切にコーディングされており、アクセス制限を認識していることを Vista に示します (つまり、アプリが適切にコーディングされていない場合は、HKLM やプログラム フォルダーなどに書き込みません)。実行に管理者権限は必要ありません)。

ただし、アプリケーションは APPDATA フォルダーに書き込むことができる必要があります (実際に使用している場合)。

CSIDL_COMMON_APPDATA ではなく CSIDL_APPDATA を使用していることを確認してください (後者は管理者権限でのみアクセス可能です)。

実際のパス (予想されるパス) を見つけるには、エクスプローラー バーに %APPDATA% と入力するようにユーザーに指示します (または Windows+R を押してから、%APPDATA% と入力して Enter します)。これにより、そのフォルダーのエクスプローラーが開きます。

于 2009-01-05T17:13:07.627 に答える
1

私の理解では、Vista は ProgramData を使用して、C:\Program Files 内に書き込もうとして失敗したファイルを書き込んでいます。これは、管理者としてアプリを実行していない限り、プログラム ファイル内に書き込めないためです。ファイルを現在のユーザーの下の AppData フォルダーに保存してみてください。

于 2009-01-05T17:40:02.843 に答える