"Acceso denegado al Registro solicitado." (System.Security.Security.Exception)

Iniciado por .:Weeds:., 20 Julio 2013, 21:23 PM

0 Miembros y 1 Visitante están viendo este tema.

.:Weeds:.

Estoy intentando acceder a esta clave en concreto y añadir un valor.
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Approved Extensions

Por lo que se ve es una zona donde no puedes toquetear tan facilmente. El problema no es de requireAdministrator. He buscado codes por internet y he probado con este.

Pero no me deja  :-\, alguna idea?

Saludos!

edito: Este codigo parece mas funcional pero tampoco sirve

Código (vbnet) [Seleccionar]
Dim user As String = Environment.UserDomainName & "\" & Environment.UserName

        Dim rs As New RegistrySecurity()

        rs.AddAccessRule(New RegistryAccessRule(user, _
                        RegistryRights.WriteKey Or RegistryRights.SetValue, _
                        InheritanceFlags.None, _
                        PropagationFlags.None, _
                        AccessControlType.Allow))

        ' Create the example key with registry security.
        Dim rk As RegistryKey
        rk = Registry.CurrentUser.CreateSubKey("Software\Microsoft\Internet Explorer\Approved Extensions", RegistryKeyPermissionCheck.ReadWriteSubTree, rs)

        If rk IsNot Nothing Then rk.Close()


El problema esta en los permisos de escritura del regedit, los puedo asignar manualmente pero eso no solucionaria mi problema  :-\


.:Weeds:.

Despues de mucho tocar y aun no se muy bien por que funciona, aqui dejo el code funcional

Código (vbnet) [Seleccionar]
       Dim user As String = Environment.UserDomainName & "\" & Environment.UserName

       Dim subkey As String = "Software\Microsoft\Internet Explorer\Approved Extensions"
       Dim rk As RegistryKey = Registry.CurrentUser.OpenSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions Or RegistryRights.ReadKey)
       Dim rs As New RegistrySecurity()
       rs.AddAccessRule(New RegistryAccessRule(user, RegistryRights.FullControl, InheritanceFlags.None, PropagationFlags.None, AccessControlType.Allow))
        rk.SetAccessControl(rs)
       rk = Registry.CurrentUser.OpenSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl)
       rk.SetAccessControl(rs)


Lo que hace el code es editar los permisos especiales y quitando el dichoso 'denegar establecer valor', ahora bien no se por que pasa esto jaja, alguien me puede comentar el code? Me gustaria entenderlo

Saludos.


Eleкtro

A pesar de tus esfuerzos el segundo código a mi no me funciona, me da el mismo error que comentas en el primer código.

He probado decenas de códigos, he estudiado un poco sobre RegistryKeyPermissionCheck ,RegistryRights ,SetAccessControl ,RegistryAccessRule , y RegistryKey

Incluso he probado un código koreano!... pero nada ha valido la pena, parece algo de locos intentar modificar los permisos de una clave en .NET, Google no tiene la respuesta.

A mi me habría gustado solucionar tu problema porque también me serviría para mi en un futuro, pero parece muy dificil conseguirlo, así que quizás quieras mirar esta alternativa que hice:
-> http://foro.elhacker.net/net/libreria_de_snippets_posteen_aqui_sus_snippets-t378770.0.html;msg1872406#msg1872406

Saludos.








.:Weeds:.

A mi me funciona que da gusto, hay tres tipos de permisos : Control total, Leer y permisos especiales. En la clave que intentaba modificar tenia los permisos de control total y leer pero el permiso especial de establecer valor denegado. Con este code me permite todos los permisos especiales, voi a testearlo en diferentes sistemas operativos pero en mi ordenador va de lujo.

No te funciona con la clave que yo intento modificar o con una tuya? Este tema me ha tocado las bowlings y hay que llegar al fondo del asunto xD

Saludos.


Eleкtro

#4
He vuelto a testearlo, y ahora me siento identificado con tu segundo comentario:
CitarDespues de mucho tocar y aun no se muy bien por que funciona,

Me parece muy estraño pero ahora si que me funciona,
ayer hice un copy/paste de tu code pero no me funcionó ni con tu clave ni con alguna otra que yo he probé.

En fin... disculpas, aunque te aseguro que ayer lo probé muchas veces tu último código sin éxito alguno...
un saludo!








.:Weeds:.

Cita de: EleKtro H@cker en 21 Julio 2013, 16:15 PM
He vuelto a testearlo, y ahora me siento identificado con tu segundo comentario:
Me parece muy estraño pero ahora si que me funciona,
ayer hice un copy/paste de tu code pero no me funcionó ni con tu clave ni con alguna otra que yo he probé.

En fin... disculpas, aunque te aseguro que ayer lo probé muchas veces tu último código sin éxito alguno...
un saludo!

edite el codigo varias veces tal vez ese fue el fallo, culpa mia en todo caso. pues me dejas mas tranquilo por que ya pensaba que iba a tener problema con el code jaja.

saludos.


Eleкtro

Una cosa, estaba haciendo ahora mismo una función genérica de tu code:

Código (vbnet) [Seleccionar]
    ''' <summary>
    ''' Modify the User permissions of a registry key.
    ''' </summary>
    Public Shared Sub Set_UserAccess_Key(ByVal RegKey As String, ByVal RegUserAccess As RegistryRights, ByVal AccessType As AccessControlType, Optional ByVal UserName As String = Nothing)


        Dim user As String = UserName
        Dim RootKey As RegistryKey = Get_Root_Key(RegKey)
        Dim KeyPath As String = Get_Key_Path(RegKey)

        If UserName Is Nothing Then user = Environment.UserDomainName & "\" & Environment.UserName

        Dim RS As New RegistrySecurity()
        Dim RK As RegistryKey = RootKey.OpenSubKey(KeyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions Or RegistryRights.ReadKey)

        RS.AddAccessRule(New RegistryAccessRule(user, RegUserAccess, InheritanceFlags.None, PropagationFlags.None, AccessType))
        RK.SetAccessControl(RS)
        RK = RootKey.OpenSubKey(KeyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, RegUserAccess)
        RK.SetAccessControl(RS)


    End Sub


Y hay un pequeño problema :-/

Si a la clave le quitas los permisos de control total entonces luego con tu code no se le pueden modificar los permisos, da error al leer la clave como yo decía en un principio, aquí:
Código (vbnet) [Seleccionar]
Dim RK As RegistryKey = RootKey.OpenSubKey(KeyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions Or RegistryRights.ReadKey)

PD: Lo he probado también con tu code de arriba sin mis modificaciones.

Esto significa que si el usuario tiene denegado el permiso de control total en la clave entonces tu code no funcionará :P

Un saludo








.:Weeds:.

Eso no lo habia pensado. Creo que la clave esta en integrar tambien mi code del principio, aun k no estoy muy seguro. Voi a estar 3 dias sin internet y no voi a poder darle caña al tema, cuando vuelva mirare a ver como solucionarlo.

Saludos.


.:Weeds:.

Cita de: EleKtro H@cker en 21 Julio 2013, 02:20 AM
A pesar de tus esfuerzos el segundo código a mi no me funciona, me da el mismo error que comentas en el primer código.

He probado decenas de códigos, he estudiado un poco sobre RegistryKeyPermissionCheck ,RegistryRights ,SetAccessControl ,RegistryAccessRule , y RegistryKey

Incluso he probado un código koreano!... pero nada ha valido la pena, parece algo de locos intentar modificar los permisos de una clave en .NET, Google no tiene la respuesta.

A mi me habría gustado solucionar tu problema porque también me serviría para mi en un futuro, pero parece muy dificil conseguirlo, así que quizás quieras mirar esta alternativa que hice:
-> http://foro.elhacker.net/net/libreria_de_snippets_posteen_aqui_sus_snippets-t378770.0.html;msg1872406#msg1872406

Saludos.

Mire otra vez más a fondo la cuestión y efectivamente mi code no funciona a 'pelo'. Probé el tuyo y le he econtrado un fallo.

El los argumentos que le pasas al SETACL.exe, le pasas como usuario %USERNAME%, pero eso no funciona. Le tienes que pasar también el nombre de dominio, si no le da permisos a un usuario llamado BUITIN que genera la aplicacion de gratis.

Código (vbnet) [Seleccionar]
Dim user As String = Environment.UserDomainName & "\" & Environment.UserName
SETACL_Info.Arguments = String.Format("-on ""{0}"" -ot reg -ace ""n:{1};p:{2}"" -rec ""{3}"" -actn ace -silent -ignoreerr -log ""{4}""", RegKey, user, Permission, Recursion, SETACL_Logfile)


Por lo demás todo bien.
Saludos.


Eleкtro