Можно ли дублировать следующий процесс ввода учетных данных в VB.NET?
-
03-07-2019 - |
Вопрос
Решение (своего рода):
Оказывается, это олицетворение с помощью .Безопасность СЕТИ разрешает доступ только на уровне приложения.Поскольку COM-объект находится на системном уровне, олицетворяемый пользователь по-прежнему не может создать его экземпляр.Я понял это, щелкнув правой кнопкой мыши исполняемый файл и выбрав "Запустить как ...", программа функционировала нормально.Я обнаружил, что запускает программу с доступом к системе (при условии, что пользователь, с которым вы ее запускаете, имеет эти учетные данные).Сейчас я нахожусь в процессе создания внешней программы, которая запустит это приложение, используя этот метод.
Спасибо за советы:D
У меня установлена Windows XP на виртуальной машине.Это часть моего домена, но вошедший в систему пользователь является только локальным.Очевидно, что если я попытаюсь получить доступ к общему сетевому ресурсу, он запросит пользователя / пароль:
Программа, которую я тестирую на виртуальной машине, использует COM-объект для взаимодействия с данными из другой программы.Если я не выдаю себя за другого, я получаю ошибки, потому что у меня нет надлежащих учетных данных.
Я провел небольшое исследование по этому вопросу и нашел несколько веб-сайтов, на которых было приличное количество VB.NET информации.Проблема, с которой я сталкиваюсь в написанном мной коде, заключается в том, что я могу получить доступ к сетевым ресурсам, но я не могу создать экземпляр COM-объекта.
Если я заполню и отправлю запрос учетных данных (выше), прежде чем пытаться создать его экземпляр, он будет работать нормально.Это наводит меня на мысль, что должно быть что-то, что делает запрос учетных данных WinXP, чего я не делаю.Ниже приведен код, который я использую для олицетворения:
Public Sub BeginImpersonation()
Const LOGON32_PROVIDER_DEFAULT As Integer = 0
Const LOGON32_LOGON_INTERACTIVE As Integer = 2
Const SecurityImpersonation As Integer = 2
Dim win32ErrorNumber As Integer
_tokenHandle = IntPtr.Zero
_dupeTokenHandle = IntPtr.Zero
If Not LogonUser(_username, _domainname, _password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, _tokenHandle) Then
win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()
Throw New ImpersonationException(win32ErrorNumber, GetErrorMessage(win32ErrorNumber), _username, _domainname)
End If
If Not DuplicateToken(_tokenHandle, SecurityImpersonation, _dupeTokenHandle) Then
win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()
CloseHandle(_tokenHandle)
Throw New ImpersonationException(win32ErrorNumber, "Unable to duplicate token!", _username, _domainname)
End If
Dim newId As New System.Security.Principal.WindowsIdentity(_dupeTokenHandle)
_impersonatedUser = newId.Impersonate()
_impersonating = True
End Sub
Я также пробовал отправлять разные флаги методу impersonator, но, похоже, ничего не работает.Вот различные флаги, которые я нашел:
Enum LOGON32_LOGON
INTERACTIVE = 2
NETWORK = 3
BATCH = 4
SERVICE = 5
UNLOCK = 7
NETWORK_CLEARTEXT = 8
NEW_CREDENTIALS = 9
End Enum
Enum LOGON32_PROVIDER
[DEFAULT] = 0
WINNT35 = 1
WINNT40 = 2
WINNT50 = 3
End Enum
Enum SECURITY_LEVEL
Anonymous = 0
Identification = 1
Impersonation = 2
Delegation = 3
End Enum
Решение
Я сталкивался с этим раньше и использовал два разных решения - самым простым было использование стороннего приложения:Тккруны: http://www.quimeras.com/Products/products.asp который позволяет вам упаковать необходимые документы в зашифрованный файл.Однако возникает проблема, если срок действия пароля истекает принудительно.
Другое решение, которое я использовал, - это вызвать новый процесс с альтернативными учетными данными:
Dim myProcessStartInfo As ProcessStartInfo = New ProcessStartInfo
With myProcessStartInfo
.FileName = "file path and name"
.Domain = "domainname"
.UserName = "username"
'password needs to be a SerureString
Using NewPassword As New Security.SecureString
With NewPassword
For Each c As Char In "password".ToCharArray
.AppendChar(c)
Next c
.MakeReadOnly()
End With
.Password = NewPassword.Copy
End Using
'UseShellExecute must be false for impersonated process
.UseShellExecute = False
End With
Using Process As New System.Diagnostics.Process
With Process
.StartInfo = myProcessStartInfo
.Start()
End With
End Using
Другие советы
С вашими определениями я использую
LogonUser(_username, _domainname, _password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, _tokenHandle)
в моем коде, который выполняет аутентификацию по сети.Я выдаю себя за локального пользователя на удаленном компьютере, как и вы.Однако это было так давно, что я не помню обоснования использования этих значений.
Я делаю аналогичную вещь для сопоставления сетевых дисков для копирования файлов между компьютерами.Я не писал код, но он почти такой же, как у вас, за исключением двух вещей:
После возврата метода Impersonate я закрываю оба токена, используя процедуру CloseHandle, прежде чем выйти из моего метода impersonator .
В верхней части олицетворителя первое, что происходит, - это вызов RevertToSelf, предположительно для отмены любого предыдущего олицетворения.
Я не знаю, смогут ли они что-то изменить, но попробовать стоит.Вот соответствующие заявления:
Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long
Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long