如何将受限用户令牌转换为非受限用户令牌?
Posted
技术标签:
【中文标题】如何将受限用户令牌转换为非受限用户令牌?【英文标题】:how do i convert restricted user token to unrestricted one? 【发布时间】:2011-04-18 14:39:03 【问题描述】:我有一个从受限制的 UAC 启动进程中复制的用户令牌,我想从中删除拒绝组 SID。我怎么做? 如果我使用 TOKEN_GROUPS 信息类类型调用 SetTokenInformation,则会收到无效参数错误。
谢谢。
【问题讨论】:
【参考方案1】:事实证明,这是一种受支持的方式。基本上你需要做一个双重间接来完成这项工作。首先,您想使用WTSQueryUserToken 获取用户令牌的会话。接下来,您需要使用GetTokenInformation 获取关联的管理用户令牌(查找 TokenLinkedToken 信息)。现在您有了 admintokn,您可以使用该令牌调用 CreateProcessAsUser。如果需要环境块,可以调用CreateEnvironmentBlock获取正确的环境变量。
这是我从一位同事那里得到的一段 VB 代码(他传递了这个技巧):
Public Function StartAppInSessionAsAdmin(ByVal SessionID As String, ByVal WinstationName As String, ByVal AppName As String) As Integer
Dim hToken As IntPtr
Dim hLinkedToken As IntPtr
Dim bRet As Boolean
Dim pi As New PROCESS_INFORMATION
Dim si As New STARTUPINFO
Dim err As Integer
Dim iret As Integer
Dim lpEB As IntPtr
Dim TLT As New TOKEN_LINKED_TOKEN
Dim TLTSize As Integer
Dim retSize As Integer
si.lpDesktop = WinstationName '”Winsta0\default”
si.cb = Marshal.SizeOf(si)
TLTSize = Marshal.SizeOf(TLT.LinkedToken)
'get SessionID token
bRet = WTSQueryUserToken(Integer.Parse(SessionID), hToken)
'we need to get the TokenLinked Token
bRet = GetTokenInformation(hToken, TOKEN_INFORMATION_CLASS.TokenLinkedToken, hLinkedToken, TLTSize, retSize)
'Use CreateEnvironment Block with the original token to create an environment for the new program with the USER Environment
bRet = CreateEnvironmentBlock(lpEB, hToken, False)
If bRet Then
'Call CreateProcessAsUser to create the process using the user's modified Token
iret = CreateProcessAsUser(hLinkedToken, Nothing, AppName, 0, 0, False, 1072, lpEB, Nothing, si, pi)
'Give user a feedback
If iret <> 0 Then
GiveFeedback(SessionID, "Message from StartAppInSessionAsAdmin", "CreateProcessAsUser succeeded", 2)
Else
err = Marshal.GetLastWin32Error
GiveFeedback(SessionID, "Message from StartAppInSessionAsAdmin", "CreateProcessAsUser failed with error " & err.ToString, 5)
End If
End If
End Function
他还写了一篇博文,提供更多信息:http://blogs.msdn.com/b/itasupport/archive/2010/03/29/uac-bypass-o-meglio-il-modo-supportato-e-by-design-di-aggirare-la-uac.aspx
【讨论】:
谢谢拉里,这正是我想要的。我已经通过修改对我感兴趣的对象的访问权限解决了最初的问题,但这在将来会非常方便。很好的答案! 另一个可能更简单、更简洁的建议:创建一个计划任务以作为用户运行并启动它。 @LarryOsterman 您认为您可以将代码发布为 VB6 吗?我从大约 12 小时开始尝试让它工作,但我得到的错误是 123,导致找不到路径。这么奇怪。该路径确实存在,我什至尝试将“”放在 AppName 前面,因为在另一个线程中我看到可能需要我。 我的意思是你的代码在blogs.msdn.com/b/itasupport/archive/2010/03/29/…。我想让我的服务在不触发 UAC 的情况下安装更新,但到目前为止,总是出现问题。请问您在这种情况下建议您使用哪一项功能? StartAppInSessionAsSystem 是否正确?以上是关于如何将受限用户令牌转换为非受限用户令牌?的主要内容,如果未能解决你的问题,请参考以下文章
我可以将 JWT 令牌放在 Golang Echo 框架的上下文中吗?