Может ли мой ответ здесь применяться к тому, что вы пытаетесь сделать?
(Копия связанного ответа)
Этот вопрос привел меня туда, где мне нужно было довольно быстро оказаться { {1}} такой же случай.
Вот как я адаптировал код:
using System; using System.Runtime.InteropServices; ///
/ // Реализует вызовы P / Invoke Interop для операционной системы. /// внутренний статический класс NativeMethods { ////// Тип выполняемой операции входа в систему. /// внутреннее перечисление LogonType: int { ////// Этот тип входа в систему предназначен для пользователей, которые будут интерактивно /// использовать компьютер, например, пользователь, входящий в систему с помощью {{1} } /// терминальный сервер, удаленная оболочка или аналогичный процесс. /// Этот тип входа требует дополнительных затрат на кэширование информации входа в систему /// для отключенных операций; поэтому он /// не подходит для некоторых клиент-серверных приложений, таких как /// почтовый сервер. /// {{1} } Interactive = 2, ////// Этот тип входа в систему предназначен для высокопроизводительных серверов для /// аутентификации паролей в виде открытого текста . /// Функция LogonUser не кэширует учетные данные для этого /// типа входа в систему. /// Network = 3, ////// Этот тип входа в систему предназначен для серверов пакетной обработки, где процессы /// могут выполняться от имени пользователем без его прямого /// вмешательства. Этот тип также подходит для высокопроизводительных серверов ///, которые одновременно обрабатывают множество попыток аутентификации с открытым текстом, /// таких как почтовые или веб-серверы. /// Функция LogonUser не кэширует учетные данные для этого /// типа входа в систему. /// Batch = 4, ////// Указывает тип службы войти в систему. В предоставленной учетной записи должна быть включена /// привилегия службы. /// Service = 5, / ///// Этот тип входа в систему предназначен для библиотек GINA, которые регистрируют пользователей, которые будут /// интерактивно использовать компьютер. /// Этот вход в систему. type может генерировать уникальную запись аудита, которая показывает ///, когда рабочая станция была разблокирована. /// Unlock = 7, { {1}} ////// Этот тип входа в систему сохраняет имя и пароль из пакета аутентификации ///, что позволяет серверу выполнять /// подключения к другим сетевым серверам при олицетворении клиента ///. Сервер может принимать учетные данные в виде открытого текста от клиента ///, вызывать LogonUser, проверять, может ли пользователь получить доступ к системе /// по сети, и по-прежнему обмениваться данными с другими {{1} } /// серверы. /// ПРИМЕЧАНИЕ. Windows NT: это значение не поддерживается. /// NetworkCleartext = 8, {{1} } ////// Этот тип входа в систему позволяет вызывающему абоненту клонировать свой текущий токен /// и указывать новые учетные данные для исходящих подключений. Новый сеанс /// входа в систему имеет тот же локальный идентификатор, но использует другие учетные данные /// для других сетевых подключений. /// ПРИМЕЧАНИЕ. Этот тип входа в систему поддерживается только поставщиком входа в систему /// LOGON32_PROVIDER_WINNT50. /// ПРИМЕЧАНИЕ. Windows NT: это значение не поддерживается. /// NewCredentials = 9 } ////// Задает поставщика входа в систему. /// внутреннее перечисление LogonProvider: int { ////// Используйте стандартный поставщик входа в систему для системы. /// Поставщиком безопасности по умолчанию является согласование, если вы не передаете /// NULL для имени домена, а имя пользователя не в формате UPN. /// В в этом случае провайдер по умолчанию - NTLM. /// ПРИМЕЧАНИЕ. Windows 2000 / NT: провайдер безопасности по умолчанию - NTLM. /// По умолчанию = 0, ////// Используйте этот провайдер, если вы будете аутентифицироваться с помощью контроллера домена Windows /// NT 3.51 (использует поставщика входа NT 3.51). /// WinNT35 = 1, ///{{1} } /// Используйте поставщика входа NTLM. /// WinNT40 = 2, ///{{1 }} /// Используйте поставщика согласованного входа в систему. /// WinNT50 = 3 } ////// Тип выполняемой операции входа в систему. /// внутреннее перечисление SecurityImpersonationLevel: int {{{1 }} ////// Серверный процесс не может получить идентификационную информацию /// о клиенте, и он не может не выдавать себя за клиента. Он /// определен без заданного значения, и, таким образом, согласно правилам ANSI C, /// по умолчанию имеет значение ноль. /// summary > Anonymous = 0, /// /// Существующий токен / // дескриптор. /// Олицетворение безопасности /// level. /// < param name = "duplicateTokenHandle"> Дубликат токена /// дескриптор. ////// Серверный процесс может получать информацию о клиенте, / // такие как идентификаторы безопасности и привилегии, но он не может /// олицетворять клиента. Это полезно для серверов, которые экспортируют /// свои собственные объекты, например, продукты баз данных, которые экспортируют /// таблицы и представления. Используя полученную информацию о безопасности клиента ///, сервер может принимать решения о проверке доступа ///, не имея возможности использовать другие службы, использующие // / контекст безопасности клиента. /// Идентификация = 1, ////// Серверный процесс может олицетворять безопасность клиента /// контекст в его локальной системе. Сервер не может олицетворять клиента /// в удаленных системах. /// Impersonation = 2,////// Серверный процесс может имитировать контекст безопасности клиента /// в удаленных системах. /// ПРИМЕЧАНИЕ. Windows NT: это олицетворение уровень не поддерживается. /// Delegation = 3 } ///{{1 }} /// Выполняет вход в систему пользователя. /// /// Имя пользователя. {{1 }} /// Домен. /// Пароль. // / Тип входа в систему. /// Поставщик входа в систему. /// Токен. ///Истина, если функция завершается успешно, ложь, если функция терпит неудачу. /// Чтобы получить расширенную ошибку информации, вызовите GetLastError. [DllImport ("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs (UnmanagedType.Bool)] { {1}} внутренний статический extern bool LogonUser ( string userName, string domain , строковый пароль, LogonType logonType, LogonProvider logonProvider, токен IntPtr); /// <сводка > /// Дублирует токен. ///Истина, если функция завершается успешно, ложь, если функция не работает. {{1 }} /// Чтобы получить расширенную информацию об ошибке, вызовите GetLastError. [DllImport ("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] [return : MarshalAs (UnmanagedType.Bool)] внутренний статический extern bool DuplicateToken ( IntPtr existingTokenHandle, SecurityImpersonationLevel securityImpersonationLevel, out IntPtr duplicateTokenHandle); ////// Закрывает дескриптор. /// /// Дескриптор. < / param> ///Истина, если функция завершается успешно, ложь, если функция терпит неудачу. /// Чтобы получить расширенную информацию об ошибке, вызовите GetLastError. {{1 }} [DllImport ("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs (UnmanagedType.Bool)] внутренний статический extern bool CloseHandle (дескриптор IntPtr ); }, за которым следует
токен IntPtr; if (! NativeMethods.LogonUser ( this.userName, this.domain, this.password, NativeMethods.LogonType.NewCredentials, NativeMethods.LogonProvider.Default, токен out)) { {1}} { throw new Win32Exception (); } попробуйте { IntPtr tokenDuplicate; {{1 }} if (! NativeMethods.DuplicateToken ( token, NativeMethods.SecurityImpersonationLevel.Impersonation, out tokenDuplicate)) { выбросить новое исключение Win32Exception () ; } попробуйте { using (WindowsImpersonationContext impersonationContext = new WindowsIdentity (tokenDuplicate) .Impersonate ()) { {1}} { // Здесь можно что-то делать с вашим общим ресурсом. impersonationContext.Undo (); return; } {{ 1}}} наконец { if (tokenDuplicate! = IntPtr.Zero) { if (! NativeMethods.CloseHandle (tokenDuplicate) ) { // Раскомментируйте, если вам нужно знать этот случай. //// throw new Win32Exception (); } } } } finally { if (token! = IntPtr.Zero) { if (! NativeMethods.CloseHandle (token)) { // Раскомментируйте, если вам нужно знать этот случай. //// throw new Win32Exception (); {{1} }} } }
Вне моей головы, вы пробовали
user@computer
вместо
computer\user
?