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