2011-07-03 7 views

Respuesta

11

Puede suplantar al usuario y luego cambiar el registro para ese contexto actual. Aquí hay un par de recursos en C# y suplantación:

Lo que se quiere hacer es algo como esto (pseudo):

using(var impersonation = new Impersonate(username,password)) 
{ 
    ChangeRegistry(keys, values); 
} 

Y cuando la suplantación se elimina, vuelve a utilizar al usuario en ejecución. Here is an example implementation de una clase Impersonate que implementa IDisposable para actuar como el pseudo-examen que se muestra arriba y here is another example.

Here is an example sobre cómo se cambian los valores del registro:

var registry = Registry.CurrentUser; 
var key = 
registry.OpenSubKey(
    @"HKEY_CURRENT_USER\Some\Path\That\You\Want\ToChange", true); 

key.SetValue(null, "");    
Registry.CurrentUser.Flush(); 

actualización

Así que lo que hay que hacer con el fin de acceder HKCU es que también hay que cargar el perfil de usuario. Esto se hace invocando otro Método Win32 que se llama LoadUserProfile. Hay un complete example here que puedes usar, pero voy a incluir los bits importantes aquí.

Primero debe incluir los métodos de Win32 como este:

[DllImport("userenv.dll", SetLastError = true, CharSet = CharSet.Auto)] 
public static extern bool LoadUserProfile(IntPtr hToken, 
             ref ProfileInfo lpProfileInfo); 

[DllImport("userenv.dll", CallingConvention = CallingConvention.Winapi, 
          SetLastError = true, CharSet = CharSet.Auto)] 
public static extern bool UnloadUserProfile(IntPtr hToken, 
                IntPtr lpProfileInfo); 

dentro de su suplantación usando bloque que tiene que hacer lo siguiente:

ProfileInfo profileInfo = new ProfileInfo(); 
profileInfo.dwSize = Marshal.SizeOf(profileInfo); 
profileInfo.lpUserName = userName; 
profileInfo.dwFlags = 1; 
Boolean loadSuccess = LoadUserProfile(tokenDuplicate, ref profileInfo); 

Y después de esto, usted debe ser capaz de acceda al HKCU. Cuando termine, debe descargar el perfil usando UnloadUserProfile(tokenDuplicate, profileInfo.hProfile);.

+0

Muchas gracias pero no funcionó, ¡cambió el registro del usuario actual y no del usuario suplantado! –

+0

¿Estás seguro de que la suplantación funcionó? Puede intentar e imprimir la identidad del usuario actual y ver quién es realmente. Además, ¿esto y las aplicaciones ASP.NET o una aplicación de Windows? Si es una aplicación web, debe permitir la suplantación. –

+0

No, es una aplicación de WPF. usando (ImpersonatedUser im = new ImpersonatedUser ("aaa", Environment.MachineName, "1")) { Registry.CurrentUser.CreateSubKey ("TMP10"); Registry.CurrentUser.Flush(); } Creó la clave en el usuario actual pero no en 'aaa' :( –

3

Tiene dos opciones. Puede hacerse pasar por ese usuario si tiene sus credenciales, como mejor lo demuestra Filip Ekberg; o

HKCU es simplemente un enlace simbólico para una de las claves bajo HKEY_USERS. Si conoce el SID de ese usuario, puede encontrarlo allí. Puede obtener el SID de la siguiente manera:

var account = new NTAccount("userName"); 
var identifier = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier)); 
var sid = identifier.Value; 

La mejor opción es suplantar. La segunda opción podría funcionar mejor cuando no conoces las credenciales de ese usuario. La desventaja es que necesitará derechos administrativos para escribir en la cuenta de otra persona.

+0

La suplantación no funcionó, pero el sid es útil, pero choqué con la excepción de acceso no autorizado, ¡aunque el UAC está desactivado y soy un administrador! –

+0

@MSS, intente solicitar permisos elevados. –

+0

¡Funcionó, mi error fue que abrí la llave para leer! el error: var clave = Registry.Users.OpenSubKey (sid); el derecho es: var clave = Registry.Users.OpenSubKey (sid. verdadero); !!! –

Cuestiones relacionadas