Foros del Web » Programación para mayores de 30 ;) » .NET »

Ver aplicaciones instaladas por el usuario

Estas en el tema de Ver aplicaciones instaladas por el usuario en el foro de .NET en Foros del Web. He creado la siguiente subrutina para sacar las aplicaciones instaladas que tiene un usuario en su PC: Código: Private Sub sb_GrabaAplicacionesInstaladas(ByVal strNombrePC As String, ByRef ...
  #1 (permalink)  
Antiguo 04/06/2007, 07:16
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
Ver aplicaciones instaladas por el usuario

He creado la siguiente subrutina para sacar las aplicaciones instaladas que tiene un usuario en su PC:
Código:
Private Sub sb_GrabaAplicacionesInstaladas(ByVal strNombrePC As String, ByRef cDB As MisClases.clsDB)
        '--Cargando todos los programas instalados en el registro--
        Dim cAplicacion As New MisClases.clsAplicaciones
        Dim cAplicacionUsuario As New MisClases.clsAplicacionesPorUsuario

        Dim Key, Key2, PR As Microsoft.Win32.RegistryKey
        Dim strProgramas() As String

        Dim strNombre As String
        Dim strVersion As String
        Dim strEmpresa As String
        Dim strRutaUnistall As String

        Key = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, strNombrePC)
        Key2 = Key.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\", Microsoft.Win32.RegistryKeyPermissionCheck.Default, Security.AccessControl.RegistryRights.FullControl)
        strProgramas = Key2.GetSubKeyNames()

        Dim strPrograma As String
        For Each strPrograma In strProgramas
            PR = Key2.OpenSubKey(strPrograma, Microsoft.Win32.RegistryKeyPermissionCheck.Default, Security.AccessControl.RegistryRights.FullControl)
            strNombre = PR.GetValue("DisplayName", "").ToString
            strVersion = PR.GetValue("DisplayVersion", "").ToString
            strEmpresa = PR.GetValue("Publisher", "").ToString
            strRutaUnistall = PR.GetValue("UnInstallString", "").ToString

            If strNombre <> "" Then
                '--Grabando en el maestro--
                With cAplicacion
                    .pr_Aplicacion = strNombre
                    .pr_Version = strVersion
                    .sb_BuscarPropiedades(.pr_Aplicacion, .pr_Version, cDB)

                    .pr_Empresa = strEmpresa
                    .sb_Grabar(cDB)
                End With
                '--------------------------

                '--Grabando aplicación instalada al usuario--
                With cAplicacionUsuario
                    .pr_NombrePC = strNombrePC
                    .pr_Aplicacion = strNombre
                    .pr_Version = strVersion
                    .sb_BuscarPropiedades(.pr_NombrePC, .pr_Aplicacion, .pr_Version, cDB)

                    .pr_Ruta = strRutaUnistall
                    .sb_Grabar(cDB)
                End With
                '--------------------------------------------
            End If
        Next

        cAplicacionUsuario = Nothing
        cAplicacion = Nothing
        '----------------------------------------------------------
    End Sub
Sucede que con un usuario administrativo la aplicación funciona correctamente, pero cuando ejecuto la aplicación con un usuario que no posee permisos de administrador, la aplicación da el siguiente error: "Requested registry access is not allowed."

Según el StackTrace, la aplicación da error al ejecutar el método "OpenSubKey". El StackTrace completo es:
Código:
at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) 
at Microsoft.Win32.RegistryKey.InternalOpenSubKey(String name, RegistryKeyPermissionCheck permissionCheck, Int32 rights) 
at Microsoft.Win32.RegistryKey.OpenSubKey(String name, RegistryKeyPermissionCheck permissionCheck, RegistryRights rights) 
at PCDescriptor.frmPrincipal.sb_GrabaAplicacionesInstaladas(String strNombrePC, clsDB& cDB) 
at PCDescriptor.frmPrincipal.sb_ObtenerInfo() 
at PCDescriptor.frmPrincipal.frmPrincipal_Load(Object sender, EventArgs e)
¿Cómo puedo, desde mi aplicación, enviar los permisos necesarios para que el usuario pueda leer el registro sin problemas?

Anteriormente ejecutaba el método "OpenSubKey" asi: "Key2 = Key.OpenSubKey("SOFTWARE\Microsoft\Windows\Current Version\Uninstall\")", pero buscando la forma de enviar los permisos desde mi aplicación, encontré una sobre carga en el método y le pude pasar los siguientes parámetros:
1) Microsoft.Win32.RegistryKeyPermissionCheck.Default
2) Security.AccessControl.RegistryRights.FullControl

Pero aún así no me funciona y me da el mismo error.

Lo más estraño es que con el usuario logueado en la PC, entro a RegEdit y puedo acceder a la llave "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninsta ll\" sin problemas.
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:29.