Настройка разрешений для записи ключей реестра с помощью .NET
Я пытаюсь предоставить доступ к параметрам реестра для записи всем пользователям или всем пользователям машины во время процесса установки.
Мое приложение не имеет соответствующих разрешений непосредственно после установки, не требуя от администратора предоставить их, даже если ключи и значения существуют, они не могут быть обновлены? У меня есть фрагмент ниже, но установщик не работает из-за отказа в доступе/доступе к неавторизованному доступу. Я думаю, что я на правильном пути...
Как я могу разрешить проблему с разрешениями без ручного внимания? Есть ли лучший подход? Я пытаюсь заменить дополнительный установщик установкой 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);
}
}
Ответы
Ответ 1
В результате я перешел на Wix 3.0. Используя установщик Wix, я могу более легко настроить и расширить мою установку.
Добавьте пространство имен Wix Util Extension:
<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>
...
Ответ 2
Я понимаю, что этот пост немного стар, но я подумал, что стоит комментировать его для всех, кто мог бы наткнуться на него, как я это делал, пытаясь найти аналогичную проблему. Вы были очень близки, я только что изменил две строки кода. Ключевое изменение - первое; при открытии ключа вам нужно открыть его как доступный для записи. Второе изменение заключается в добавлении новых разрешений, а не в замене всех разрешений... поскольку вы предоставляете всем полный доступ, вам действительно не нужно это изменение, но если вы добавляете разрешения для одного пользователя, вы хотите добавить права доступа.
Каждое изменение я сделал первые комментарии из старой строки с//ИЗМЕНЕНЫ:
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);
}
Ответ 3
Лучший подход заключается в том, чтобы разместить настройки своего приложения где-нибудь, чтобы ваши пользователи получили разрешение на обновление.
Ответ 4
попробуйте это
new System.Security.Permissions.RegistryPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
try
{
//Your code
}catch
{
}finally
{
System.Security.Permissions.RegistryPermission.RevertAssert();
}