【发布时间】: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