Как передать учетные данные на компьютер, чтобы на нем можно было использовать Microsoft.Win32.RegistryKey.OpenRemoteBaseKey ()? - PullRequest
13 голосов
/ 30 марта 2010

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

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

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

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

1 Ответ

33 голосов
/ 30 марта 2010

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

    #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 ()" будет означать, что вы больше не вошли в систему как этот пользователь. Так что не используйте его, пока не закончите. Но не забудьте использовать его!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...