Algoritmo que recorra todo el registro

26/02/2007 - 04:06 por Pietro | Informe spam
Hola a todos, tuve un problema al intentar obtener todas las llaves del
registro de local machine:
Para ir probando el algoritmo hice un formulario con 2 listbox:

RegistryKey reg = Registry.LocalMachine;
string[] llaves = reg.GetSubKeyNames();
for (int i = 0; i < llaves.Length; i++)
{
listBox1.Items.Add(llavesIdea.ToString());
}


Hasta ahi todo bien, lo que me arroja error es cuando intento abrir las
subkeys

foreach (string subKeys in reg.OpenSubKey(holaIdea))

Pero no me deja: Error 1 foreach statement cannot operate on variables
of type 'Microsoft.Win32.RegistryKey' because 'Microsoft.Win32.RegistryKey'
does not contain a public definition for 'GetEnumerator' C:\Documents and
Settings\Pietro\Mis documentos\Visual Studio
2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 37 17
WindowsApplication2

Que se les ocurre??

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
26/02/2007 - 08:02 | Informe spam
"Pietro" wrote in message
news:
foreach (string subKeys in reg.OpenSubKey(holaIdea))

Pero no me deja: Error 1 foreach statement cannot operate on
variables
of type 'Microsoft.Win32.RegistryKey' because
'Microsoft.Win32.RegistryKey'
does not contain a public definition for 'GetEnumerator'



El "OpenSubKey" te devuelve un objeto de tipo RegistryKey, que no es
Enumerable y por tanto no se puede recorrer con un foreach. Para obtener las
subclaves tienes que llamar a su método GetSubKeyNames, que te devuelve un
array de Strings (que sí es enumerable).
Respuesta Responder a este mensaje
#2 Pietro
26/02/2007 - 19:23 | Informe spam
Uff muchisimas gracias, se me habia pasado, ahora modifique el codigo:

foreach (string subKeys in
Registry.LocalMachine.OpenSubKey(llaves[i].ToString()).GetSubKeyNames())
{

listBox2.Items.Add(subKeys);
}

Pero me tira un error, lo he leido y nose como solucionar el problema de
seguridad que me dice que hay, nunca antes lo habia tenido.
Podria intentar con un catch(SecurityException), pero no es la idea ya que
algo esta fallando y nose lo que es.

System.Security.SecurityException was unhandled
Message="Acceso denegado al Registro solicitado."
Source="mscorlib"
StackTrace:
en System.ThrowHelper.ThrowSecurityException(ExceptionResource
resource)
en Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean
writable)
en Microsoft.Win32.RegistryKey.OpenSubKey(String name)
en WindowsApplication1.Form1.button1_Click(Object sender, EventArgs
e) en C:\Documents and Settings\Pietro\Mis documentos\Visual Studio
2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs:línea 37
en System.Windows.Forms.Control.OnClick(EventArgs e)
en System.Windows.Forms.Button.OnClick(EventArgs e)
en System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
en System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons
button, Int32 clicks)
en System.Windows.Forms.Control.WndProc(Message& m)
en System.Windows.Forms.ButtonBase.WndProc(Message& m)
en System.Windows.Forms.Button.WndProc(Message& m)
en
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,
Int32 msg, IntPtr wparam, IntPtr lparam)
en System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
en
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32
dwComponentID, Int32 reason, Int32 pvLoopData)
en
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32
reason, ApplicationContext context)
en
System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,
ApplicationContext context)
en System.Windows.Forms.Application.Run(Form mainForm)
en WindowsApplication1.Program.Main() en C:\Documents and
Settings\Pietro\Mis documentos\Visual Studio
2005\Projects\WindowsApplication2\WindowsApplication2\Program.cs:línea 17
en System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
en System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence
assemblySecurity, String[] args)
en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
en System.Threading.ThreadHelper.ThreadStart_Context(Object state)
en System.Threading.ExecutionContext.Run(ExecutionContext
executionContext, ContextCallback callback, Object state)
en System.Threading.ThreadHelper.ThreadStart()
Respuesta Responder a este mensaje
#3 Alberto Poblacion
26/02/2007 - 20:42 | Informe spam
"Pietro" wrote in message
news:
Uff muchisimas gracias, se me habia pasado, ahora modifique el codigo:
[...]
Pero me tira un error,
[...]
System.Security.SecurityException was unhandled



Tiene pinta de que no tienes permiso de acceso a la clave en cuestión.
¿Has probado a mirar con el Debugger cuál es la clave del registro en la que
te da error, y a acceder a esa clave con el regedt32, a ver si tiene
permisos para el usuario que está ejecutando el programa?
Respuesta Responder a este mensaje
#4 Pietro
26/02/2007 - 23:25 | Informe spam
Si, fue lo primero que hice, se me olvido mencionarlo, pero no es eso, de
todas maneras estoy ejecutando el programa con administrador. Me dice que es
en la subkey SAM, si no me equivoco tiene relacion con el archivo SAM que
almacena las password... pero bueno el punto es que el error es en SAM, se
podria solucionar con un if(subKey == "SAM"); break; pero me gustaria saber
por qué pasa esto que me tiene metido.
Graciaas nuevamente
Respuesta Responder a este mensaje
#5 Pietro
26/02/2007 - 23:37 | Informe spam
Se me olvidaba que el debugger me dice que una de las soluciones puede ser
usar un certificado para obtener los permisos, hay una herramienta que se
llama Caspol.exe estoy leyendo sobre el tema pero hasta el momento no he
podido implementarlo en mi aplicacion.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida