Как передать учетные данные машине, чтобы я мог использовать Microsoft.Win32.RegistryKey.OpenRemoteBaseKey() на нем?

Этот .NET API работает нормально, если я пытаюсь открыть реестр на машине, которая находится в том же домене, что и я (и мой зарегистрированный пользователь имеет права администратора на целевой машине).

Это становится сложным, если это машина, находящаяся вне домена, с другим локальным административным пользователем (у кого у меня есть пароль).

Я попытался использовать WNetUseConnection() (который хорошо мне помог в прошлом в ситуациях, когда то, что я хотел, это читать удаленный диск файл) до вызова OpenRemoteBaseKey(), но без кубиков - я получаю исключение, запрещенное доступом.

Ясно, что я должен передавать учетные данные каким-либо другим способом, но как?

Ответ 1

То, что я успешно использовал для доступа к файлам на компьютере, - это следующий код:

    #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 

И затем для подписи, просто используйте:

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

Как вы могли видеть, "Undo()" означает, что вы больше не подписывались как этот пользователь. Поэтому не используйте его, прежде чем закончите. Но не забудьте использовать его!