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.