Заставляют 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)
Класс 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;
}
}
}
Одна вещь, которую вы должны знать о разрешениях, - это то, что они летучий . Это означает, что вы можете выполнить проверку безопасности в разделе реестра, попытаться добавить свое значение только в том случае, если проверка пройдена, а затем по-прежнему не удастся с исключением недостаточного доступа, поскольку разрешения изменились между тем, когда вы выполнили проверку и когда вы действовали по результатам. Это возможно, даже если они являются последовательными операторами в вашей программе.
Предоставленные разрешения безопасности имеют тенденцию быть относительно стабильными, но шанс все же существует. Это означает, что у вас должен быть код для обработки исключения безопасности, и если вам все равно придется это сделать, там ' На самом деле нет никакого смысла делать чек вообще. Вместо этого потратьте время на то, чтобы немного улучшить обработчик исключений.
Тем не менее, "бух" любому приложению, которое хочет что-то запустить при запуске. ЯГНИ.
Думаю, лучше всего просто попытаться добавить свое значение к ключу и аккуратно обработать сбой, сообщив пользователю, что у него недостаточно прав для этого.
Если вы пишете какой-то административный инструмент, который всегда запускается администратором, вы должны указать это в манифесте . Таким образом, ваше приложение будет повышаться при запуске (через приглашение UAC).
Я не уверен, как это сделать с C #, но с Win32 вы должны использовать RegGetKeySecurity ()
. Может есть обертка C #? В противном случае используйте P / Invoke.
Просто попробуйте открыть раздел реестра с разрешениями WRITE.
Тем не менее, то, что другие сказали, правильно: невозможно определить, будет ли операция успешной, если вы ее не попробуете. Может, кто-то удалил клавишу «Выполнить». Возможно, реестр превысит выделенную память. Может диск вышел из строя.