Как Исполнить роль пользователя для копии файла по сети, когда DNS или netbios не доступны [дубликат]

11
задан Community 23 May 2017 в 12:25
поделиться

2 ответа

Может ли мой ответ здесь применяться к тому, что вы пытаетесь сделать?


(Копия связанного ответа)

Этот вопрос привел меня туда, где мне нужно было довольно быстро оказаться { {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, 
 /// по умолчанию имеет значение ноль. 
 ///  
Anonymous = 0, 
 
 ///  
 /// Серверный процесс может получать информацию о клиенте, 
 / // такие как идентификаторы безопасности и привилегии, но он не может 
 /// олицетворять клиента. Это полезно для серверов, которые экспортируют 
 /// свои собственные объекты, например, продукты баз данных, которые экспортируют 
 /// таблицы и представления. Используя полученную информацию о безопасности клиента 
 ///, сервер может принимать решения о проверке доступа 
 ///, не имея возможности использовать другие службы, использующие 
 // / контекст безопасности клиента.
 ///  
Идентификация = 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); 
 
 /// <сводка > 
 /// Дублирует токен. 
 ///  
 ///  Существующий токен 
 / // дескриптор.  
 ///  Олицетворение безопасности 
 /// level.  
 /// < param name = "duplicateTokenHandle"> Дубликат токена 
 /// дескриптор.  
 ///  Истина, если функция завершается успешно, ложь, если функция не работает. {{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} }} 
} 
} 
 
8
ответ дан 3 December 2019 в 10:25
поделиться

Вне моей головы, вы пробовали

user@computer

вместо

computer\user

?

0
ответ дан 3 December 2019 в 10:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: