문제

솔루션 (킨다) :

.NET의 보안을 사용한이 사칭은 애플리케이션 수준에만 액세스 할 수 있습니다. COM 객체가 시스템 수준에 있으므로 가장 한 사용자는 여전히 인스턴스화 할 수 없습니다. 실행 파일을 마우스 오른쪽 버튼으로 클릭하고 "run as ..."를 선택 하여이 프로그램은 잘 작동했습니다. 시스템 액세스를 통해 프로그램을 시작한다는 것을 알았습니다 (실행중인 사용자가 해당 자격 증명이 있다고 가정). 이제이 방법을 사용 하여이 응용 프로그램을 시작하는 외부 프로그램을 작성하는 과정에 있습니다.

팁에 감사드립니다 : d


가상 시스템에 Windows XP 설치가 있습니다. 내 도메인의 일부이지만 로그인 한 사용자는 로컬 사용자입니다. 분명히 네트워크 공유에 액세스하려고하면 사용자/비밀번호를 자랑합니다.

alt text

가상 머신에서 테스트하는 프로그램은 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top