Windows 7で「Program Files」ファイルを編集できないのはなぜですか?


25

Windows 7でこのファイルの編集に問題があります:

C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules\FindJNI.cmake

Cygwin(vi)またはTextPadで編集すると、これらの2つのプログラムが変更を確認するため、ディスクのどこかに書き込まれます。しかし、DOS cmdシェルでファイルを「タイプ」すると、ファイルはまったく変更されていないように見えます。

私が気づいた1つのことは、cmdシェルでは所有者はAdministratorsですが、Cygwinのbashシェルでは所有者はDanです:

C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules>dir /Q FindJ*
 Volume in drive C is Windows7_OS
 Volume Serial Number is 92CA-8707

 Directory of C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

12/30/2011  09:45 AM             1,480 BUILTIN\Administrators FindJasper.cmake
12/30/2011  09:45 AM             7,951 BUILTIN\Administrators FindJava.cmake
12/30/2011  09:45 AM            10,632 BUILTIN\Administrators FindJNI.cmake
12/30/2011  09:45 AM             1,669 BUILTIN\Administrators FindJPEG.cmake
               4 File(s)         21,732 bytes
               0 Dir(s)  132,524,654,592 bytes free


Dan@home /c/Program Files (x86)/CMake 2.8.7/share/cmake-2.8/Modules
$ ls -al FindJ*
-rwx------+ 1 Dan            None 10636 Jan 30 13:57 FindJNI.cmake
-rwx------+ 1 Administrators None  1669 Dec 30 09:45 FindJPEG.cmake
-rwx------+ 1 Administrators None  1480 Dec 30 09:45 FindJasper.cmake
-rwx------+ 1 Administrators None  7951 Dec 30 09:45 FindJava.cmake

どうすればいいの?同じディレクトリに同じ名前の2つの異なるファイルがあるようです。


エラーメッセージが表示されていますか?
ChrisF

なんらかのWoW64フォルダーリダイレクト(Cygwinは32ビットなので)でしょうか?
アンドリューランバート

回答:


35

Windows Vista(UAC)で導入されたセキュリティ機能により、「Program Files」などの保護された場所に書き込もうとする管理者以外のプログラムは、書き込みをキャッチして代替の「ユーザーフレンドリー」な場所にリダイレクトします。

ファイルを作成したプログラムはファイルを見ることができますが、他のほとんどのプログラムは見ることができません。

ウィキペディアは次のように述べています(関連するセクションを強調しました)。

ユーザーが管理者特権で実行されることを前提に書かれたアプリケーションは、多くの場合、マシン全体またはシステムディレクトリ(プログラムファイルなど)またはレジストリキーに書き込もうとしたため、制限されたユーザーアカウントから実行するとWindowsの以前のバージョンで問題が発生しました(特にHKLM)。UACは、ファイルとレジストリの仮想化を使用してこれを軽減しようとします。これにより、書き込み(および後続の読み取り)がユーザーのプロファイル内のユーザーごとの場所にリダイレクトされます。たとえば、アプリケーションが「C:\ program files \ appname \ settings.ini」への書き込みを試行し、ユーザーがそのディレクトリへの書き込み権限を持っていない場合、書き込みは「C:\ Users \ username」にリダイレクトされます。 \ AppData \ Local \ VirtualStore \ Program Files \ appname \ settings.ini」。

したがって、理論的には、変更されたファイルは実際に書き込まれていますC:\Users\YourUserName\AppData\Local\VirtualStore\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules

この制限を回避する唯一の方法は、UACを完全に無効にすることです。これはセキュリティ上の理由からお勧めできません。

最良の解決策は、実際にパスにcmakeを配置し、ユーザープロファイル内のどこかのような保護されていない場所を使用することです。


ありがとう。非常に紛らわしいです。しかし、私のパスにcmakeがある(またはない)と、どのように違いが生じますか?問題は、このcmakeファイルが正しく機能していないため、このcmakeファイルをデバッグしようとしていることです。
ダン

申し訳ありませんが、ファイルに対してcmakeを実行していると想定していました。ファイルを使用するには、他の場所に書き込む必要があります。その後、エクスプローラーを使用してファイルをコピーする必要があります。これが目的であることを確認するように求めるUACプロンプトが表示されます。ファイルは上書きされます。主なことは、それらの場所にあるファイルのコピー/書き込みにUAC対応プログラム(エクスプローラーなど)しか使用できないことです。
Mokubai

回避策はUACを無効にすることだけではありません。ファイル/フォルダのセキュリティタブに移動して、問題Modifyを引き起こしているファイル/ディレクトリをUsersユーザーグループに許可するだけです。
スコットチェンバレン

LOLこの動作は奇妙です!それは私が持っていた多くの奇妙さを説明しています。ありがとう。
ジェズ

13

Program Filesフォルダーは管理者権限で保護されています。Windows XP以前では、ほとんどの人が常に管理者として実行されていました。多くのプログラムはこれが事実であると想定し、すべての作業をProgram Filesフォルダーで行いました。

Windows Vistaがリリースされたとき、彼らはこの慣行を止め、代わりにアプリケーションに以下を使用するように強制しました。

C:\ Users \%Username%\ AppData

これにより、多くの古いアプリケーションが破損しました。古いアプリケーションが管理者専用フォルダーを引き続き使用できるように、Windowsは変更されたファイルを保持する仮想ストアを作成しました。

C:\ Users \%Username%\ AppData \ Local \ VirtualStore

そこにファイルがあります。また、フォルダを開いてウィンドウの上部にある[ 互換性ファイル ]ボタンを押すと、エクスプローラを使用できます。


ありがとう。これ(および受け入れられた答え)は、私が抱えていた非常に謎めいた問題を解決しました。それが説明された今、完全に理にかなっています。あなたの答えは短く、直接的なものです。+1ありがとう!
ridgerunner

0

同様の問題があり、Windows 7(XPから)に移行した直後に、ファイルを解凍しようC:\Program Filesとしていて、アクセス拒否エラーが表示され続けました。

かなり苦労した後、アクセス権を変更してAdministratorsグループのフルアクセスを許可する前に、フォルダー全体の所有権を取得する必要があることがわかりました。

フォルダを右クリックし、に行く:フォルダの所有権を取得するためにProperties、その後、をクリックしてSecurity]タブ、クリックAdvancedし、Ownerタブを、クリックEdit。「サブコンテナとオブジェクトの所有者を置き換える」にチェックマークを付けてから、新しい所有者(「管理者」グループなど)を選択して、と言いOKます。


うーん、あなたは所有権を取る必要はありません。Usersグループに変更許可を与えるだけです。ただし、プログラムファイルへのフルアクセスを許可しないでください。すべての人が管理者であるというデフォルトは、設計上の悪い選択であり、Vistaで修正しようとしました。
スコットチェンバレン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.