¿Cómo puedo pasar las credenciales a una máquina para que pueda utilizar Microsoft.Win32.RegistryKey.OpenRemoteBaseKey () sobre ella?
-
23-09-2019 - |
Pregunta
Esta API .NET funciona bien si yo estoy tratando de abrir el registro en una máquina que está en el mismo dominio que soy (y mi usuario ha iniciado sesión tiene derechos de administrador en el equipo de destino).
Se pone difícil si se trata de una máquina fuera del dominio con un usuario administrativo diferente, local (de los cuales tengo la contraseña).
He intentado utilizar WNetUseConnection () (lo que me ha servido bien en el pasado en situaciones en las que lo que quería era leer un archivo de disco remoto) antes de llamar a OpenRemoteBaseKey (), pero no dice -. me sale una excepción negado el acceso
Es evidente, que debe pasar credenciales de alguna otra manera, pero ¿cómo?
Solución
Lo que yo he utilizado con éxito para acceder a archivos en un ordenador es el siguiente código:
#region imports
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(string
lpszUsername, string lpszDomain, string lpszPassword,
int dwLogonType, int dwLogonProvider, ref
IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
private static extern bool CloseHandle(IntPtr handle
);
[DllImport("advapi32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
public extern static bool DuplicateToken(IntPtr
existingTokenHandle,
int SECURITY_IMPERSONATION_LEVEL, ref IntPtr
duplicateTokenHandle);
#endregion
#region logon consts
// logon types
const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_LOGON_NETWORK = 3;
const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
// logon providers
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_PROVIDER_WINNT50 = 3;
const int LOGON32_PROVIDER_WINNT40 = 2;
const int LOGON32_PROVIDER_WINNT35 = 1;
#endregion
Y a continuación, para la firma, en parte, sólo tiene que utilizar:
IntPtr token = IntPtr.Zero;
bool isSuccess = LogonUser("username", "domain", "password",
LOGON32_LOGON_NEW_CREDENTIALS,
LOGON32_PROVIDER_DEFAULT, ref token);
using (WindowsImpersonationContext person = new WindowsIdentity(token).Impersonate())
{
//do your thing
person.Undo();
}
Como se puede ver, "Deshacer ()" hará que ya no haya iniciado sesión como ese usuario. Así que no lo use antes de que haya terminado. Pero no se olvide de usar!