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

1

当我们想要授予对文件夹的完全控制权时,为了解决这个问题,我们使用以下命令。您应该能够从 Wix 运行它:

icacls.exe "C:\ProgramData\MyCompany\MyApplication" /grant Users:(OI) (CI)F
于 2014-03-11T20:49:11.693 回答
0

我接受了 Daniel Persson 建议的想法,并在 WIX 中查找了等效的调用,最终成为 Permission EX。在 Directory.wxs (我为我的 INSTALLFOLDER 放置片段的同一个文件中,我添加了另一个目录,如下所示

        <!--Directory for Config file-->
        <Directory Id="CommonAppDataFolder">
            <Directory Id="commonAppDataMyCompany" Name="MyCompany"/>
        </Directory>

接下来我创建了一个名为 Permissions.wxs 的新文件

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <Fragment>
        <ComponentGroup Id="ProductPermissions">
            <Component Id="INS_COMP" DiskId="1" Guid="{YOUR-GUID}"  Directory="INSTALLFOLDER">
                <CreateFolder Directory="INSTALLFOLDER">
                    <util:PermissionEx User="Users" GenericAll="yes"/>
                </CreateFolder>
            </Component>
            <Component Id="CMN_APP" DiskId="1" Guid="{YOUR-GUID}"  Directory="commonAppDataMyCompany">
                <CreateFolder Directory="commonAppDataMyCompany">
                    <util:PermissionEx User="Users" GenericAll="yes"/>
                </CreateFolder>
            </Component>
        </ComponentGroup>
    </Fragment>
</Wix>

最后要做的是引用那个新的组件组。

    <!--Features to add to cab file-->
    <Feature Id="ProductFeature" Title="Keymon Setup" Level="1">
        <ComponentGroupRef Id="ProductComponents" />
        <ComponentGroupRef Id="ProductContentComponents" />
        <ComponentGroupRef Id="RegistrySetings" />
        <ComponentGroupRef Id="ProductPermissions"/>
        <ComponentRef Id="ApplicationShortcut"/>
    </Feature>

好了,现在我的两个通用应用程序数据文件夹都继承了权限,我的 INSTALL 文件夹也是如此,这是我们的 IT 部门让人们做的事情。现在他们不应该再这样做了:)

于 2014-03-12T15:28:00.557 回答