CommonApplicationData дает неправильные разрешения

Я был на всем протяжении Google и назад, пытаясь выяснить это. Позвольте мне рассказать вам о проблеме, а затем рассказать / показать вам, что я пытаюсь сделать, чтобы решить указанную проблему. Таким образом, проблема заключается в том, что я устанавливаю программу, которую я написал, на другой компьютер только с одной учетной записью (встроенная учетная запись администратора). Затем я создаю нового стандартного пользователя и запускаю программу с этим новым пользователем. Пока я не внесу никаких изменений в файл конфигурации (XML-файл, расположенный в CommonApplicationData) через мою программу, проблем не будет. Однако, если я внесу изменение, то моя программа аварийно завершит работу с исключением 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);
    }

Я очень расстроен, потому что это кажется такой тривиальной вещью. "Как администратор пометьте эту новую папку / подпапку / файлы как FullControl by Everyone", чтобы любой новый пользователь, созданный до или после, мог читать и писать в этот файл. Куда я иду не так?

2 ответа

Когда мы хотим предоставить полный контроль над папкой, что мы делаем, чтобы обойти эту проблему, мы используем следующую команду. Вы должны быть в состоянии запустить это из Wix:

icacls.exe "C:\ProgramData\MyCompany\MyApplication" /grant Users:(OI) (CI)F

Я взял идею, предложенную Даниэлем Перссоном, и посмотрел эквивалентный вызов в 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, что и делали люди в нашем ИТ-отделе. Теперь они не должны делать это больше:)

Другие вопросы по тегам