0

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

4

1 に答える 1

3
  • WTSQueryUserToken は、LocalSystem でのみ呼び出すことができます
  • WTSQueryUserToken は PrimaryToken を返します。複製する必要はありません。
  • このトークンには既に適切なセッション ID と環境 (現在ログオンしているユーザーから派生したもの) があるため、環境ブロックを作成する必要はありません。
于 2012-04-10T13:58:25.020 に答える