私は、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 サービスとして実装されます。