2011-02-09 39 views
7

Estoy escribiendo una aplicación que necesita crear una cuenta de usuario especial oculta de las pantallas de inicio de sesión y del applet de usuarios del Panel de control. Al escribir un valor de 0 DWORD con el nombre de usuario a la clave de registro de abajo, yo soy capaz de lograr este objetivo:No se puede escribir en el registro en HKEY_LOCAL_MACHINE Software

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ SpecialAccounts \ UserList

El problema es que en Windows 7 con UAC activado, no importa lo que intento, no puedo escribir un valor de forma programática en la clave anterior.

Tengo entendido que escribir en ciertas teclas no está permitido en Windows 7 con UAC activado, a menos que se esté ejecutando con privilegios administrativos. Agregué un manifiesto de aplicación requestedExecutionLevel level="requireAdministrator" uiAccess="false", acepto el aviso de UAC cuando se ejecuta mi programa, mi cuenta es miembro de Administradores, y aún así no puedo escribir en la clave de registro anterior.

¿Qué más debo hacer? ¿Cómo es posible, en cualquier configuración de aplicación, escribir claves y valores en HKEY_LOCAL_MACHINE\SOFTWARE?

Más información ... Cuando se ejecuta mi programa, no se producen errores y parece escribir valores. Supongo que Windows está virtualizando la ubicación a la que estoy escribiendo. Necesito escribir en la ubicación real, no en la virtual, si debo ocultar esta cuenta de usuario especial.

+0

Probablemente están tratando de prevenir exactamente lo que su tratando de hacer. Una cuenta oculta escrita por malware sería mala, por ejemplo. – asawyer

+0

Sin embargo, esto se aplica al todo en HKEY_LOCAL_MACHINE \ SOFTWARE, no solo a la clave específica que mencioné. Ah, y aún puedes ocultar la cuenta usando regedit, o verla usando administración de computadoras/usuarios. – sysrpl

+0

Disculpa, fue solo un comentario indirecto. Si tuviera una buena respuesta para ti, hubiera usado la otra caja. También estoy muy interesado en lo que está sucediendo aquí. – asawyer

Respuesta

12

Probablemente el programa se ejecuta como un programa de 32 bits en el sistema operativo de 64 bits? En el caso, le recomiendo buscar los valores que creó bajo Wow6432Node subclave del HKEY_LOCAL_MACHINE\SOFTWARE.

Puede leer más acerca de este tipo de virtualización here. Puede usar KEY_WOW64_32KEY flag en alguna API para poder trabajar con registro completo sin virtualización.

+0

Derecha, ya había descubierto que los valores se escribían en Wow6432Node. El problema es que el usuario que oculta el código en Windows no ve las claves debajo de esa ubicación. Consulte http://social.answers.microsoft.com/Forums/en-SG/w7security/thread/e4d1c727-a0b3-4ce8-b95e-7f113b576ee6 y http://community.kaseya.com/xsp/f/21/p /223/646.aspx ... El primer enlace fue marcado como resuelto a través de una corrección privada por el escudo de instalación, y como tal la solución no se redistribuye abiertamente. – sysrpl

+0

@sysrpl: El problema se puede resolver fácilmente si usa una bandera 'KEY_WOW64_32KEY' adicional en' RegCreateKeyEx' o 'RegOpenKeyEx'. Luego puede usar el controlador 'HKEY' para acceder a cualquier parte del registro. Utilizo el truco sin ningún problema. Si necesita, podría publicar un pequeño ejemplo de C que lo demuestre. – Oleg

+0

@sysrpl: ¿Necesita crear una clave de registro dentro de la configuración? – Oleg

0

Esto podría tener algo que ver con la redirección que agregaron en Vista. Me gustaría saber si trataste de leer el valor de registro de tu código, si recuperas el valor que esperabas. También es posible que desee iniciar RegMon para ver si puede ver dónde la redirección puede estar forzándolo.

1

escribir el valor Registry

string user = Environment.UserDomainName + "\\" + Environment.UserName; 

RegistrySecurity rs = new RegistrySecurity(); 

rs.AddAccessRule(new RegistryAccessRule(user, 
    RegistryRights.WriteKey | RegistryRights.ChangePermissions, 
    InheritanceFlags.None, PropagationFlags.None, AccessControlType.Deny)); 

RegistryKey rk = null; 
try 
{ 
    rk = Registry.CurrentUser.CreateSubKey("SOFTWARE\\TEST", 
            RegistryKeyPermissionCheck.Default, rs); 
    rk.SetValue("NAME", "IROSH); 
    rk.SetValue("FROM", "SRI LANKA"); 
} 
0
RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true); 
rk.SetValue("Name", "Value"); 
+2

escribe alguna explicación para tu código, para mejorar tu respuesta –

Cuestiones relacionadas