Как я проверяю, разрешают ли пользователю читать / пишут конкретный ключ реестра?

Заставляют Python regex дерево синтаксического анализа отлаживать Ваш regex.

Регулярные выражения являются замечательной особенностью Python, но отладка их может быть болью, и слишком легко понять regex превратно.

, К счастью, Python может распечатать regex дерево синтаксического анализа, путем передачи недокументированного, экспериментального, скрытого флага re.DEBUG (на самом деле, 128) к re.compile.

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

, Как только Вы понимаете синтаксис, можно определить ошибки. Там мы видим, что я забыл выходить [] в [/font].

, Конечно, можно объединить его с любыми флагами, которые Вы хотите, как прокомментированный regexes:

>>> re.compile("""
 ^              # start of a line
 \[font         # the font tag
 (?:=(?P<size>  # optional [font=+size]
 [-+][0-9]{1,2} # size specification
 ))?
 \]             # end of tag
 (.*?)          # text between the tags
 \[/font\]      # end of the tag
 """, re.DEBUG|re.VERBOSE|re.DOTALL)
13
задан HalliHax 27 July 2009 в 15:08
поделиться

5 ответов

Класс RegistryPermission управляет разрешениями безопасности для ключей реестра. Чтобы проверить, есть ли у вас доступ на запись к разрешению, вы используете его следующим образом:

RegistryPermission perm1 = new RegistryPermission(RegistryPermissionAccess.Write, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");

Затем вы должны использовать метод «Demand» в попытке / улове и возвращать его при неудаче (возникновение исключения безопасности). В случае успеха вы продолжите и выполните обновление. Хотя это не совсем то, что вам нужно, проверка разрешений перед доступом, это общепринятый способ убедиться, что у вас есть необходимые разрешения, прежде чем вы начнете работать с ключами. В полностью структурированном виде это будет равняться:

try
{
    RegistryPermission perm1 = new RegistryPermission(RegistryPermissionAccess.Write, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
    perm1.Demand();
}
catch (System.Security.SecurityException ex)
{
    return;
}

//Do your reg updates here

РЕДАКТИРОВАТЬ: Подумав о том, что я упомянул в комментарии, вот методы расширения класса RegistryPermission для проверки разрешений:

using System.Security.Permissions;
using System.Security;

public static class RegistryExtensions
{
    public static bool HavePermissionsOnKey(this RegistryPermission reg, RegistryPermissionAccess accessLevel, string key)
    {
        try
        {
            RegistryPermission r = new RegistryPermission(accessLevel, key);
            r.Demand();
            return true;
        }
        catch (SecurityException)
        {
            return false;
        }
    }

    public static bool CanWriteKey(this RegistryPermission reg, string key)
    {
        try
        {
            RegistryPermission r = new RegistryPermission(RegistryPermissionAccess.Write, key);
            r.Demand();
            return true;
        }
        catch (SecurityException)
        {
            return false;
        }
    }

    public static bool CanReadKey(this RegistryPermission reg, string key)
    {
        try
        {
            RegistryPermission r = new RegistryPermission(RegistryPermissionAccess.Read, key);
            r.Demand();
            return true;
        }
        catch (SecurityException)
        {
            return false;
        }
    }
}
17
ответ дан 1 December 2019 в 20:30
поделиться

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

Предоставленные разрешения безопасности имеют тенденцию быть относительно стабильными, но шанс все же существует. Это означает, что у вас должен быть код для обработки исключения безопасности, и если вам все равно придется это сделать, там ' На самом деле нет никакого смысла делать чек вообще. Вместо этого потратьте время на то, чтобы немного улучшить обработчик исключений.

Тем не менее, "бух" любому приложению, которое хочет что-то запустить при запуске. ЯГНИ.

7
ответ дан 1 December 2019 в 20:30
поделиться

Думаю, лучше всего просто попытаться добавить свое значение к ключу и аккуратно обработать сбой, сообщив пользователю, что у него недостаточно прав для этого.

Если вы пишете какой-то административный инструмент, который всегда запускается администратором, вы должны указать это в манифесте . Таким образом, ваше приложение будет повышаться при запуске (через приглашение UAC).

5
ответ дан 1 December 2019 в 20:30
поделиться

Я не уверен, как это сделать с C #, но с Win32 вы должны использовать RegGetKeySecurity () . Может есть обертка C #? В противном случае используйте P / Invoke.

0
ответ дан 1 December 2019 в 20:30
поделиться

Просто попробуйте открыть раздел реестра с разрешениями WRITE.

Тем не менее, то, что другие сказали, правильно: невозможно определить, будет ли операция успешной, если вы ее не попробуете. Может, кто-то удалил клавишу «Выполнить». Возможно, реестр превысит выделенную память. Может диск вышел из строя.

0
ответ дан 1 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: