【问题标题】:Problem with parameters in CreateProcessAsUserCreateProcessAsUser 中的参数问题
【发布时间】:2011-03-24 14:36:27
【问题描述】:

我被指派使用 VB.NET 2005 构建一个能够向当前交互式用户启动进程的 Windows 服务。

经过一番研究,我构建了以下代码:

Dim hToken As IntPtr = IntPtr.Zero
Dim LastW32Error As Integer

If WTSQueryUserToken(WTSGetActiveConsoleSessionId(), hToken) Then
        Dim hTokenDup As IntPtr = IntPtr.Zero
        If DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, Nothing, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenPrimary, hTokenDup) Then
            Dim hEnv As IntPtr = IntPtr.Zero
            If CreateEnvironmentBlock(hEnv, hTokenDup, False) Then
                Dim strCommandLine As String = "c:\\windows\\system32\\NotePad.exe"
                Dim saProcessAttributes As SECURITY_ATTRIBUTES = New SECURITY_ATTRIBUTES
                Dim saThreadAttributes As SECURITY_ATTRIBUTES = New SECURITY_ATTRIBUTES
                Dim pi As New PROCESS_INFORMATION
                Dim si As New STARTUPINFO

                saProcessAttributes.nLength = Convert.ToUInt32(Marshal.SizeOf(saProcessAttributes))
                saThreadAttributes.nLength = Convert.ToUInt32(Marshal.SizeOf(saThreadAttributes))
                si.cb = Convert.ToUInt32(Marshal.SizeOf(si))

                If Not CreateProcessAsUser(hTokenDup, Nothing, strCommandLine, saProcessAttributes, saThreadAttributes, False, 0, hEnv, Nothing, si, pi) Then
                    LastW32Error = Marshal.GetLastWin32Error()
                    EvtLog.WriteEntry("CreateProcessAsUser: " + CStr(LastW32Error))
                End If
            Else
                LastW32Error = Marshal.GetLastWin32Error()
                EvtLog.WriteEntry("CreateEnvironmentBlock: " + CStr(LastW32Error))
            End If
            DestroyEnvironmentBlock(hEnv)
        Else
            LastW32Error = Marshal.GetLastWin32Error()
            EvtLog.WriteEntry("DuplicateTokenEx: " + CStr(LastW32Error))
        End If
        CloseHandle(hTokenDup)
Else
    LastW32Error = Marshal.GetLastWin32Error()
    EvtLog.WriteEntry("WTSQueryUserToken: " + CStr(LastW32Error))
End If

CloseHandle(hToken)

但我在调用 CreateProcessAsUser 时收到错误 87 (ERROR_INVALID_PARAMETER)。有人可以指出我做错了什么?

代码实现为在 LocalSystem 帐户下运行的 Windows 服务。

【问题讨论】:

  • 这不可能了。谷歌“会话 0 隔离”找出原因。
  • @Hans 我认为这是可能的,这就是这样做的方法。
  • @Hans,它仍然是可能的:blogs.msdn.com/b/winsdk/archive/2009/07/14/… -- 我的问题只是 CreateProcessAsUser 调用。
  • 您能否尝试为两个安全属性参数传递 nil。最好尝试找出哪些参数窗口被视为无效。

标签: vb.net winapi windows-services pinvoke createprocessasuser


【解决方案1】:
  • WTSQueryUserToken 只能在 LocalSystem 下调用
  • WTSQueryUserToken 返回 PrimaryToken。无需复制。
  • 这个令牌已经有正确的 sessionID 和环境(它是从当前登录的用户派生的),所以不需要创建环境块

【讨论】:

  • 根据文档,默认环境块不是从令牌派生的,而是从调用进程中复制而来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多