我有一个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()现在停止模拟,我可以使用凭据进行网络操作