¿Cómo puedo pasar las credenciales a una máquina para que pueda utilizar Microsoft.Win32.RegistryKey.OpenRemoteBaseKey () sobre ella?

StackOverflow https://stackoverflow.com/questions/2541504

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?

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top