1

私はグーグルのいたるところにいて、これを理解しようとしています。問題を説明してから、その問題を解決するために私が何をしようとしているのかを説明/表示させてください. したがって、問題は、作成したプログラムを、1 つのアカウント (組み込みの管理者アカウント) のみを使用して別のコンピューターにインストールすることです。次に、新しい標準ユーザーを作成し、この新しいユーザーでプログラムを実行します。私のプログラムで構成ファイル (CommonApplicationData にある xml ファイル) を変更しない限り、問題はありません。ただし、変更を加えると、AccessDenied 例外でプログラムがクラッシュします。初めてこのエラーに遭遇したときは、そのフォルダーに移動して新しいテキスト ファイルを作成しようとしたので、このエラーが発生した理由を高低で検索し始めました。ここで、管理者としてログインして構成ファイルを削除し、標準ユーザーとしてログインしてプログラムを実行すると、構成ファイルが再作成され、ユーザーがファイルへの読み取り/書き込みアクセス権を持つようになりました。だから私の質問は、どうすれば最初からそれを行うことができますか?

私が試したのは、NUnit を使用して、私のプログラムが実行した場合とまったく同じ場所に構成ファイルを作成するテストを作成したことです。そして、私がそれから読み書きできると主張し、合格します。奇妙なのは、標準ユーザーとして特定のセキュリティ オプション セット (以下のコード) を使用してフォルダーを作成すると、管理者アカウントがファイルの読み取りまたは書き込みを行うことができなくなることです。

    [TestFixtureSetUp]
    public void Setup()
    {
        xmlPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyCompany\\MyProgram");
        xmlFileLocation = System.IO.Path.Combine(xmlPath, "MyConfig.xml");
        fileInfo = new FileInfo(xmlFileLocation);
    }
    [Test]
    public void TestCreateNewFolder()
    {
        Assert.IsFalse(fileInfo.Directory.Exists);
        Console.WriteLine("Creating new directory:{0}", fileInfo.DirectoryName);
        Console.WriteLine("Directory.FullName:{0}", fileInfo.Directory.FullName);

        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
        NTAccount acct = sid.Translate(typeof(NTAccount)) as NTAccount;
        string strEveryoneAccount = acct.ToString();

        FileSystemAccessRule everyOne = new FileSystemAccessRule(strEveryoneAccount, FileSystemRights.FullControl, AccessControlType.Allow);
        DirectorySecurity dirSecurity = new DirectorySecurity(fileInfo.DirectoryName, AccessControlSections.Group);
        dirSecurity.AddAccessRule(everyOne);

        fileInfo.Directory.Create(dirSecurity);
    }

これはとても些細なことのように思えるので、私は非常にイライラしています。「管理者として、この新しいフォルダー/サブフォルダー/ファイルを全員がフルコントロールとしてマークする」ようにして、前後に作成された新しいユーザーがこのファイルを読み書きできるようにします。どこが間違っていますか?

4

2 に答える 2