vb.net에서 다음 자격 증명 프로세스를 복제 할 수 있습니까?
-
03-07-2019 - |
문제
솔루션 (킨다) :
.NET의 보안을 사용한이 사칭은 애플리케이션 수준에만 액세스 할 수 있습니다. COM 객체가 시스템 수준에 있으므로 가장 한 사용자는 여전히 인스턴스화 할 수 없습니다. 실행 파일을 마우스 오른쪽 버튼으로 클릭하고 "run as ..."를 선택 하여이 프로그램은 잘 작동했습니다. 시스템 액세스를 통해 프로그램을 시작한다는 것을 알았습니다 (실행중인 사용자가 해당 자격 증명이 있다고 가정). 이제이 방법을 사용 하여이 응용 프로그램을 시작하는 외부 프로그램을 작성하는 과정에 있습니다.
팁에 감사드립니다 : 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
나는 또한 다른 깃발을 가장 한 깃발을 가장 한 깃발을 보내려고했지만 아무것도 작동하지 않는 것 같습니다. 내가 찾은 다른 깃발은 다음과 같습니다.
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
해결책
나는 이전에 이것에 빠졌고 두 가지 다른 솔루션을 사용했습니다. 가장 쉬운 것은 타사 앱을 사용하는 것이 었습니다 : tqcrunas : 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)
내 코드에서 네트워크를 통해 인증되는 코드. 나는 당신처럼 원격 상자에서 로컬 사용자를 가장합니다. 그러나 오래 전부터 이러한 값을 사용하는 근거를 기억하지 못했습니다.
기계 간 파일을 복사하기 위해 MAP 네트워크 드라이브와 비슷한 작업을 수행합니다. 나는 코드를 쓰지 않았지만 두 가지를 제외하고는 당신과 거의 동일합니다.
가장 한 방법이 반환 된 후 CloseHandle 루틴을 사용하여 두 토큰을 닫습니다.
가장 먼저 가장 먼저 발생하는 일은 이전에 사천을 취소해야 할 것으로 예상됩니다.
나는 그들이 변화를 일으킬지 모르겠지만 시도해 볼 가치가 있습니다. 관련 선언은 다음과 같습니다.
Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long
Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long