如何清除来自logonuser“new credentials”的模拟

时间:2013-03-11 22:52:46

标签: .net vb.net pinvoke impersonation

我有一个winform,我想冒充其他用户来调用IIS中托管的服务。我从文本框中获取用户凭据,非常基本。我正在为#v;" logonuser"使用logontype" New Credentials":http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v=vs.85).aspx获取模拟令牌(我不能使用logontype" Interactive"因为我们的组策略不适用允许它)。

这很好用,我可以使用模拟身份调用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

因此,在使用来自此函数的windowsimpersonationcontext之后,如果我只是调用" undo()"在它上面,它不会恢复原始用户的网络凭据。如何清除这些新凭据?

有什么想法吗?

修改

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

0 个答案:

没有答案