Come faccio a passare le credenziali a una macchina in modo da poter usare Microsoft.Win32.RegistryKey.OpenRemoteBaseKey () su di esso?

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

Domanda

Questa API .NET funziona bene se sto cercando di aprire il Registro di sistema in una macchina che è nello stesso dominio come lo sono io (e il mio utente connesso dispone dei diritti di amministratore sul computer di destinazione).

Diventa difficile se si tratta di una macchina fuori-di-dominio con un diverso, l'utente amministrativo locale (di cui io ho la password).

Ho cercato di usare WNetUseConnection () (che mi ha servito bene in passato, in situazioni in cui ciò che volevo era quello di leggere un file su disco remoto) prima di chiamare OpenRemoteBaseKey (), ma niente da fare -. ho ottenere un accesso negato un'eccezione

Chiaramente, devo passare le credenziali in qualche altro modo, ma come?

È stato utile?

Soluzione

Quello che ho usato con successo per accedere ai file su un computer è il seguente codice:

    #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 

E poi per la firma in parte, basta usare:

        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(); 
        } 

Come si può vedere, "Annulla ()" farà che non sei più l'accesso come quell'utente. Quindi non usare prima il gioco è fatto. Ma non dimenticate di usarlo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top