0

我有一个 winform,我想在其中模拟不同的用户来调用 IIS 中托管的服务。我从文本框中获取用户凭据,非常基本。我正在使用登录类型“新凭据”来使用“登录用户”来获取模拟令牌:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa378184 (v=vs.85) .aspx (我不能使用登录类型“交互式”,因为我们的组策略不允许它)。

这工作正常,我可以使用模拟身份调用 IIS 服务,因为它具有一组新的网络凭据,但我的问题是我找不到之后如何清除模拟(另外,如果可能的话,我不想使用winapi“reverttoself”功能)。

如何恢复到原始用户网络凭据?这是我的模拟功能:

       Friend Shared Function GetContext(ByVal username As String, ByVal domain As String, ByVal password As SecureString) As WindowsImpersonationContext

            Dim token As IntPtr = IntPtr.Zero
            Dim passwordPtr As IntPtr = IntPtr.Zero
            Dim idContext As WindowsIdentity

            Try
                passwordPtr = Marshal.SecureStringToGlobalAllocUnicode(password)

                If NativeMethods.LogonUser( username,
                                            domain,
                                            passwordPtr,
                                            CInt(NativeMethods.LogonSessionType.NewCredentials),
                                            CInt(NativeMethods.LogonProvider.Default),
                                            token) = False Then
                    Throw New ComponentModel.Win32Exception(Marshal.GetLastWin32Error())
                End If

                idContext = New WindowsIdentity(token)

                Return idContext.Impersonate()
            Catch ex As Exception
                Throw
            Finally
                Marshal.ZeroFreeGlobalAllocUnicode(passwordPtr)
                If Not IntPtr.op_Equality(token, IntPtr.Zero) Then
                    NativeMethods.CloseHandle(token)
                End If
            End Try

        End Function

因此,在使用来自该函数的 windowssimpersonationcontext 之后,如果我只是在其上调用“undo()”,它不会恢复为原始用户的网络凭据。如何清除此新凭据?

有任何想法吗?

编辑

想通了,我现在使用 LOGON32_LOGON_NETWORK_CLEARTEXT LogonType,我得到了想要的行为。在函数返回的上下文上调用 Undo() 现在会停止模拟,我可以使用凭据进行网络操作

4

0 回答 0