如何将受限用户令牌转换为非受限用户令牌?

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 是否正确?

以上是关于如何将受限用户令牌转换为非受限用户令牌?的主要内容,如果未能解决你的问题,请参考以下文章

在 MVC 中使用 OAuth 持有者令牌 (JWT)

我可以将 JWT 令牌放在 Golang Echo 框架的上下文中吗?

windwos核心编程进程

如何在登录回调中使用授权码获取 UBER 访问令牌

我应该如何在 axios GET 请求中发送 JWT 令牌? [复制]

保护有状态的 Web 服务