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

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

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

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

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


person JCCyC    schedule 29.03.2010    source источник


Ответы (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(); 
        } 

Как вы могли видеть, «Отменить ()» заставит вас больше не входить в систему как этот пользователь. Так что не используйте его, пока не закончите. Но не забывайте им пользоваться!

person Oskar Kjellin    schedule 29.03.2010
comment
Могу ли я хранить переменную токена в течение длительного времени, а затем использовать блок using / Undo () в разных точках приручения, используя тот же токен? - person JCCyC; 30.03.2010
comment
Я так думаю. На самом деле выполняет вход в систему. Я использовал GetImpersonation (), который возвращает контекст WindowsImpersonationContext, как указано выше. - person Oskar Kjellin; 30.03.2010
comment
Но не сможет ли person.Undo () сделать переменную person непригодной для использования в будущем? Мой план состоял в том, чтобы вызвать LogonUser (), сохранить указатель токена, а затем использовать различные блоки using, точно такие же, как ваш, каждый с созданием нового объекта WindowsImpersonationContext. - person JCCyC; 30.03.2010
comment
Или, может быть, я НЕ могу каждый раз вызывать Undo (), просто используя (person) {something (); }, затем с помощью (person) {something_else (); }, а затем, когда я уверен, что соединение мне больше не понадобится, person.Undo ()? - person JCCyC; 30.03.2010
comment
Тогда вы будете каждый раз избавляться от своего объекта и не сможете его отменить (я думаю). Возможно, вместо этого просто оставьте человека висеть и не используйте его, а вместо этого явно вызовите dispose - person Oskar Kjellin; 30.03.2010
comment
У вас есть DuplicateToken в вашем импорте, но он никогда не используется в вашем примере, для чего это? - person Scott Chamberlain; 21.07.2010
comment
@Scott: Может быть, я не очень хорошо очищаю код :) - person Oskar Kjellin; 29.07.2010
comment
Я пробовал использовать ваш код, я все еще не могу получить доступ к реестру удаленного устройства с помощью openremotebasekey - person ; 10.02.2011
comment
@hari я думаю, это может быть другая проблема - person Oskar Kjellin; 14.02.2011
comment
@ Оскар Челлин. Спасибо! Ваш ответ мне очень помог. - person Vano Maisuradze; 04.08.2011