2

次のプログラムは、Windows 7 上の Visual Studio 2010 でコンパイルすると機能しません。

#include <stdio.h>

int main()
{
    int status;

    status = rename("C:\\Temp\\A.dat","C:\\Temp\\a.dat");
    status = rename("C:\\ProgramData\\A.dat","C:\\ProgramData\\a.dat");

    return 0;
}

最初の名前変更は機能しますが、2 番目の名前変更は機能しません。どちらの場合も、名前変更関数は 0 を返します。大文字と小文字を区別する名前変更が機能しない c:\ProgramData の何が特別なのですか?

参考までに、cygwin gcc 4.8.3 でコンパイルすると、プログラムは正常に動作します。

4

1 に答える 1

1

C:\ProgramDatahas には、標準ユーザーがそこに書き込めないようにするセキュリティ設定があります。これは新しいものではなくWindows 8Windows 7同じであり、上の同等のフォルダーVistaもこの方法で保護されています。おそらく、Windows 7UAC の環境が無効になっていないか、標準ユーザーへの書き込みアクセスを確保C:\ProgramDataまたは許可している可能性があります。C:\ProgramData\MyProgramName

UACについて何かしなければならないこと

Microsoft がUACを導入したとき、少なくともしばらくの間、古いアプリケーションが動作し続ける方法が必要でした。彼らが思いついたのは、「ファイルとレジストリの仮想化」でした。これは、(現在は)禁止されているシステム フォルダーまたはレジストリ エントリにアクセスしようとするレガシー アプリケーションが、それらのリソースのユーザー固有の「仮想化」コピーにリダイレクトされるというものです。UACに関するウィキペディアの記事として。

簡単に言うと、ProgramData にはユーザー固有ではないアプリケーション データが含まれています。このデータは、コンピューター上のすべてのユーザーが利用できます。

このフォルダを使用するには、いくつかの方法があります。一部のアプリケーションは、インストーラー プロセスが管理者特権で実行されている間、インストール中にのみ書き込みます。次に、標準ユーザーとして実行されるアプリケーション自体は、読み取りはできますが、書き込みを試みることはありません。

もう 1 つの方法は、インストーラーが C:\ProgramData のサブ フォルダーを作成して、標準ユーザー、または開発者が適切と判断したユーザー/グループに書き込みアクセスを許可することです。

プログラムが「管理者として実行」権限を持っている場合、この問題を回避できるはずです。

于 2015-04-21T16:01:58.893 に答える