Установка прав записи ключа реестра с помощью .NET - PullRequest
15 голосов
/ 28 января 2010

Я пытаюсь предоставить доступ на запись к настройкам реестра моего приложения всем или всем пользователям компьютера в процессе установки.

Мое приложение не имеет соответствующих разрешений сразу после установки, не требуя от администратора предоставления их, даже если ключи и значения существуют, их нельзя обновить? Ниже приведен фрагмент кода, но программа установки не работает из-за несанкционированного доступа / доступа запрещен. Я думаю, что я на правильном пути ...

Как я могу решить проблему с разрешениями, не требуя ручного вмешательства? Есть ли лучший подход? Я пытаюсь заменить дополнительный установщик установщиком Visual Studio, добавив эту функцию.

    protected void GrantAllAccessPermission(String key)
    {
        try
        {
            SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
            NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount;

            // Get ACL from Windows, allow writing to the registry key
            using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key, true))
            {

                RegistrySecurity rs = new RegistrySecurity();

                // Creating registry access rule for 'Everyone' NT account
                RegistryAccessRule rar = new RegistryAccessRule(
                    account.ToString(),
                    RegistryRights.FullControl,
                    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
                    PropagationFlags.None,
                    AccessControlType.Allow);

                rs.AddAccessRule(rar);
                rk.SetAccessControl(rs);
            }

        }
        catch (System.Security.SecurityException ex)
        {
            throw new InstallException(
                String.Format("An exception in GrantAllAccessPermission, security exception! {0}", key),  
                ex);
        }
        catch (UnauthorizedAccessException ex)
        {
            throw new InstallException(
                String.Format("An exception in GrantAllAccessPermission, access denied! {0}", key),  
                ex);
        }

    }

Ответы [ 4 ]

10 голосов
/ 01 января 2013

Я понимаю, что этот пост немного стар, но я подумал, что стоит прокомментировать его для любого, кто может наткнуться на него, как я, пытаясь выяснить аналогичную проблему. Вы были очень близки, я просто изменил две строки кода. Смена ключа - первая; при открытии ключа его нужно открыть как доступный для записи. Второе изменение заключается в добавлении новых разрешений, а не замене всех разрешений ... поскольку вы предоставляете всем полный доступ, это изменение на самом деле не требуется, но если вы добавляете разрешения для одного пользователя, вам нужно добавить разрешения.

Каждое изменение, которое я сделал первым, комментирует старую строку с помощью // CHANGED:

SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount;

// Get ACL from Windows

// CHANGED to open the key as writable: using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key))
using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key, RegistryKeyPermissionCheck.ReadWriteSubTree))
{

        // CHANGED to add to existing security: RegistrySecurity rs = new RegistrySecurity();
    RegistrySecurity rs = rk.GetAccessControl()

    // Creating registry access rule for 'Everyone' NT account
    RegistryAccessRule rar = new RegistryAccessRule(
        account.ToString(),
        RegistryRights.FullControl,
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
        PropagationFlags.None,
        AccessControlType.Allow);

    rs.AddAccessRule(rar);
    rk.SetAccessControl(rs);
}
1 голос
/ 09 октября 2015

попробуйте

 new   System.Security.Permissions.RegistryPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
try
{
//Your code
}catch
{
}finally
{
       System.Security.Permissions.RegistryPermission.RevertAssert();
}
1 голос
/ 02 февраля 2010

Я остановился на другом и лучшем подходе, переключившись на Wix 3.0. Используя установщик Wix, я могу легче настроить и расширить мою установку.

Добавить пространство имен расширения Wix Util:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'>

Пример Wix для разрешений реестра:

<!-- Registry entries -->
<DirectoryRef Id="TARGETDIR">
  <Component Id="RegistryEntries" Guid="{YOUR-GUID}">

    <!-- Create registry keys and grant user rights -->
    <!-- Add Registry Keys and default values as necessary -->
    <RegistryKey Root="HKLM" Key="$(var.RegKey)" Action="create">
        <util:PermissionEx User="[WIX_ACCOUNT_USERS]"  GenericAll="yes"/>
    </RegistryKey> 
    ...
1 голос
/ 28 января 2010

Лучшим подходом является размещение настроек вашего приложения там, где у ваших пользователей будет разрешение на обновление.

...