服务中的用户会话(非0)中的CreateProcessAsUser(IIS 7)

时间:2012-06-28 15:26:28

标签: iis-7 windows-server-2008 createprocessasuser

我的设置是:

  • Windows Server 2008,IIS 7

我想要完成的事情:

  • IIS 7接收来自我网站的请求以执行某些3D操作(在WPF中),最后IIS 7应该呈现图像并将其存储在磁盘上的某处以加载到网站中

我所知道的以及我已经测试过的内容:

  • IIS 7在Windows Server 2008上的会话0中作为服务运行
  • 会话0中的任何服务都无权访问视频驱动程序,即会话0中的任何服务都无法执行任何呈现任务(在此处说明:Session 0 Isolation
  • Microsoft在另一篇论文中建议在用户会话中创建一个进程(通过CreateProcessAsUser)来成功执行渲染。

到目前为止我取得的成就:

  • LogonUser运行良好
  • CreateProcessAsUser效果很好

唯一(但很重要)不起作用的部分: 当我使用用户名和密码登录并以用户身份创建进程时,该进程仍在会话0中,因此呈现失败。用户成功登录(我检查过)。根据Microsoft,必须可以在用户会话中创建进程(而不是会话0)。

  • 如何在0以外的其他会话中以用户身份创建流程?
  • 我是否必须自己创建一个新会话或类似的东西?

谢谢!

我的代码:

        PROCESS_INFORMATION processInfo = new PROCESS_INFORMATION();
        STARTUPINFO startInfo = new STARTUPINFO();
        Boolean bResult = false;
        IntPtr hToken = IntPtr.Zero;
        UInt32 uiResultWait = WAIT_FAILED;
        int processCreationFlags;

        try
        {
            // Logon user
            bResult = Win32.LogonUser(
                strName,
                strDomain,
                strPassword,
                Win32.LogonType.LOGON32_LOGON_BATCH,
                Win32.LogonProvider.LOGON32_PROVIDER_DEFAULT,
                out hToken
            );
            if (!bResult) { throw new Exception("Logon error #" + Marshal.GetLastWin32Error()); }

            CheckPrivileges(hToken);

            // Create process
            startInfo.cb = Marshal.SizeOf(startInfo);
            startInfo.lpDesktop = null;
            startInfo.dwFlags = Convert.ToInt32(STARTF.STARTF_USESHOWWINDOW);
            startInfo.wShowWindow = Convert.ToInt16(SHOWWINDOW.SW_HIDE);
            processCreationFlags = Convert.ToInt32(CreateProcessFlags.CREATE_BREAKAWAY_FROM_JOB);


            retStr += "command line: " + strCommand + Environment.NewLine;
            bResult = Win32.CreateProcessAsUser(
                hToken,
                null, //application name
                strCommand, //command line
                IntPtr.Zero, //process attributes
                IntPtr.Zero, //thread attributes
                false, //inherit handles
                processCreationFlags, //process creation flags
                IntPtr.Zero, //environment
                curDir, //current directory
                ref startInfo, 
                out processInfo
            );
            if (!bResult) { throw new Exception("CreateProcessAsUser error #" + Marshal.GetLastWin32Error()); }

            // Wait for process to end
            uiResultWait = WaitForSingleObject(processInfo.hProcess, INFINITE);
            if (uiResultWait == WAIT_FAILED) { throw new Exception("WaitForSingleObject error #" + Marshal.GetLastWin32Error()); }
        }
        finally
        {
            // Close all handles
            CloseHandle(hToken);
            CloseHandle(processInfo.hProcess);
            CloseHandle(processInfo.hThread);
        }

1 个答案:

答案 0 :(得分:0)

我不是该领域的专家,只是进行了一些搜索,似乎你实际上无法更改会话级别,而是应该让用户启用自动登录并与在该用户下运行的进程通信。

这似乎最有用:Windows 2008 RenderFarm Service: CreateProcessAsUser "Session 0 Isolation" and OpenGL

相关问题