问题标签 [session-0-isolation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2024 浏览

windows-vista - 会话 0 隔离

Vista 推出了一项新的安全措施,阻止会话 0 访问视频卡等硬件,并且用户不再登录会话 0。我知道这意味着我无法向用户显示 GUI,但是,这是否也意味着我不能显示一个吗?我的代码现在设置的方式,只使它成为命令行会做更多的工作,但是如果我可以使用我现有的代码并且只是以编程方式管理 GUI,它将需要更少的代码。

这可能吗?

MSDN 的文章是这样说的:

• 服务尝试在会话 0 中创建用户界面 (UI),例如对话框。由于用户未在会话 0 中运行,因此他或她永远看不到 UI,因此无法提供服务正在运行的输入寻找。该服务似乎停止运行,因为它正在等待未发生的用户响应。

这让我觉得有可能拥有一个自动化的 UI,但有人告诉我你不能将 SendKeys 与服务一起使用,因为它在 Session 0 中被禁用。

编辑:我实际上不需要向用户展示 GUI

0 投票
1 回答
3579 浏览

windows-server-2008 - 从 windows-2008-server 中的服务在非零会话中创建进程?

我想知道服务是否有一种简单的方法可以在用户会话中创建进程?

我的服务作为用户(管理员)帐户而不是作为 LocalSystem 帐户运行,因此我无法使用 WTSQueryUserToken 功能。

我试过打电话

但是当我使用这个令牌运行时

我的进程仍在会话 0 中运行。我该如何解决这个问题?

我正在使用 Ole 自动化,所以我并不关心进程将在哪个会话上运行,只要它不是会话 0 - 因为出于某种原因 Ole 不会创建它的进程(winword.exe 用于instance) 在会话 0 中,而是在其他用户会话中创建它们。

任何建议都将受到欢迎。提前致谢。

0 投票
3 回答
11457 浏览

opengl - Windows 2008 RenderFarm 服务:CreateProcessAsUser“会话 0 隔离”和 OpenGL

我有一个旧的 Windows 服务器服务和(衍生)应用程序,在 XP-64 和 W2K3 中运行良好,但在 W2K8 上失败。我相信这是因为新的“会话 0 隔离”功能。

因此,我正在寻找代码示例/安全设置 mojo,它可以让您从 Windows 服务为 Windows 2008 Server 创建一个新进程,以便我可以恢复(并可能超越)以前的行为。我需要一个解决方案:

  1. 在非零会话中创建新进程以绕过会话 0 隔离限制(无法从会话 0 访问图形硬件) - 官方的 MS 行是:

因为会话 0 不再是用户会话,所以在会话 0 中运行的服务无权访问视频驱动程序。这意味着服务渲染图形的任何尝试都会失败。在会话 0 中查询显示分辨率和颜色深度会报告系统的正确结果,最大分辨率为 1920x1200,每像素 32 位。

  1. 新进程获得可用于创建 windows DC 的 windows 站/桌面(例如 winsta0/default)。我在这里找到了一个解决方案(在交互式会话中启动 OK):Start an Interactive Client Process in C++

  2. Windows DC,当用作OpenGL DescribePixelFormat 枚举的基础时,能够找到并使用硬件加速格式(在适当配备 OpenGL 硬件的系统上)。请注意,我们当前的解决方案在 XP-64 和 W2K3 上运行良好,除非终端服务会话正在运行(VNC 工作正常。)一个也允许进程工作的解决方案(即即使在终端服务会话打开时也使用 OpenGL 硬件加速运行)将是狂热的,尽管不是必需的。

我目前被困在第 1 项上,尽管有一些类似的帖子讨论了这个问题(比如thisthis - 它们不是合适的解决方案,因为不能保证用户会话已经登录以“获取”一个会话 id 来自,我也不是从 LocalSystem 帐户运行(我是从服务的域帐户运行,我可以在合理的范围内调整其权限,尽管我宁愿不必升级优先级以包括SeTcbPrivileges。)

例如 - 这是一个我认为应该可以工作的存根,但在 SetTokenInformation 调用上总是返回错误 1314(即使 AdjustTokenPrivileges 没有返回错误)我也使用了一些涉及“LogonUser”的替代策略(而不是打开现有的进程令牌),但我似乎无法换出会话 ID。

我也怀疑在所有情况下都使用 WTSActiveConsoleSessionId(例如,如果没有交互式用户登录) - 尽管在没有登录会话的情况下运行服务的快速测试似乎返回了合理的会话值 (1)。

为了便于阅读,我删除了错误处理(仍然有点混乱 - 道歉)

在调用 SetTokenInformation 之前,所有调试输出看起来都很好——我看到会话 0 是我当前的进程会话,就我而言,它正在尝试设置会话 1(WTSGetActiveConsoleSessionId 的结果)。(请注意,我是通过 VNC 而不是 RDC 登录到 W2K8 框的)

所以 - 一个问题:

  1. 这种方法是否有效,还是所有服务启动的进程都被有意限制在会话 0 中?
  2. 有没有更好的方法(缺少“登录时启动”和服务器自动登录?)
  3. 这段代码是否有问题,或者创建进程令牌的不同方式,我可以换出会话 ID 以指示我想在新会话中生成进程?我确实尝试使用 LogonUser 而不是 OpenProcessToken,但这也不起作用。(我不在乎所有生成的进程是否共享相同的非零会话。)

非常感谢任何帮助 - 谢谢!

0 投票
1 回答
7265 浏览

.net - 绕过 Windows Server 2008 中的会话 0 隔离 - 成功,但仍然不可见

我基本上按原样使用位于此处的代码来启动一个进程。此代码在 Vista/7 中完美运行——如果我使用启动一个进程,System.Diagnostics.Process.Start()我看到它启动了,但由于它位于会话 0 中而不可见。使用此代码,我看到进程在会话 1 中启动(同一个会话我在 Vista/7 中手动启动程序)。

现在,在 Server 2008 中,当我手动启动程序时,它会打开会话 2。当我不使用此代码时,我看到进程仍会启动会话 0。当我使用此代码时,它会启动会话 1 --但不可见。大概这是因为它没有在与我相同的会话中启动,因此存在于其他地方的“不可见”桌面上。

有没有人遇到过这个问题?该博客似乎比较受欢迎,所以我很难相信这个问题还没有得到解决。我正在使用的服务器是 64 位架构的,我的 win 7 机器是 32 位的。我不认为这有什么不同,博客表明该解决方案适用于两种架构。

0 投票
2 回答
804 浏览

fonts - 渲染期间的 Windows Server 2008 特殊字体

因此,我们在 Server 2008 上运行了一项服务,该服务启动了一个进行一些渲染的进程(C# 应用程序)。该过程运行成功,但它使用的是系统字体(我相信是 Arial)而不是应该加载的字体。如果我通过登录服务器手动运行此过程,则字体加载成功并且该过程正确呈现。

我尝试使用 CreateProcessWithLogonW 运行此过程,但这仍然不起作用。我假设这与 Server 2008 中的非交互式会话有关,但我不知道如何解决它。

0 投票
0 回答
362 浏览

iis-7 - 在 IIS 中运行的 Mathematica 中未加载字体

我在我的 Asp.Net 应用程序(在 IIS 7.5 下运行)中使用 Mathematica 的.NET/Link,但是遇到了一些 Mathematica 使用的自定义字体没有显示的问题。

例如字符 Pi 没有出现。它应该看起来像:预期的但实际上看起来像:在此处输入图像描述

这个问题只发生在一台特定的机器上,并且只有在 IIS 中运行它时,如果我在控制台应用程序中创建这个图像(甚至使用 IIS Express),那么这个图像就可以很好地创建。

对于那些对 .NET/Link 有一定经验的人,我用来创建图像的代码是:

但我不认为理解这一点是必需的,因为我认为这只是加载字体并在 IIS 中使用它的问题。

所以,我想问题的核心是:除了权限问题之外,IIS(或任何 Windows 服务)是否有任何理由无法读取/处理字体(因为我尝试以管理员身份运行该服务)。

0 投票
1 回答
4131 浏览

windows - 在 WinServer 2008 中从非交互式进程(Windows 服务、计划任务等)打印 PDF

我正在尝试编写一个打印 PDF 的非交互式进程,我需要有关如何在 Windows Server 2008(和 Vista/7)上构建它的建议。

以前,我们有一个计划任务(无论用户帐户是否登录都设置为运行),它将打印目录内的所有 PDF。(一个单独的进程会将 PDF 移动到目录中。)在运行时,这将启动另一个进程(Adobe Reader 或 Foxit Reader)来打印 PDF。Adobe Reader 和 Foxit Reader 都具有静默打印功能,因此所有内容都将发送到运行计划任务的用户的默认打印机。从未生成任何 UI,所有文件都可以顺利打印。这适用于 Server 2003。

该过程不再适用于 Server 2008。我不完全确定,但我相信这与会话 0 隔离有关。我无法证明这一点。但是,我可以说,当设置为“仅在用户登录时运行”时,该进程作为计划任务工作。现在,虽然这可行,但它会强制用户登录机器,因此不能满足我的要求。(我的第一个线索是在上一个问题中。)

我无法确定如何继续前进。有什么方法可以满足我的要求吗?

几点注意事项:

我见过的每个解决方案似乎都在使用登录用户的凭据。请参阅我上面链接的问题 - 列出的解决方案似乎是获取登录用户的令牌并使用它来运行程序。(查看 GetCurrentUserToken() 过程 - 返回值稍后在 API 调用 CreateProcessAsUser() 中使用。)

据我所知,我当前的流程没有生成 UI。我已经使用 ProcMon 验证了阅读器进程(Adobe 或 Foxit)似乎可以正确打印,并且打印驱动程序本身似乎有问题。这可以通过尝试使用打印到文件驱动程序来支持 - 打印到文件驱动程序以三个可见步骤运行,并且清楚地完成所有文件的第一个步骤,而无需启动第二个步骤。那么 Session 0 Isolation 如何影响打印机驱动程序呢?这对我来说不清楚。(我能找到的关于该主题的最佳文档只提到打印机驱动程序可能会受到影响,即使打印后台处理程序在会话 0 中运行。)

作为 Windows 服务的打印永远不会起作用,即使该进程已选中“允许服务与桌面交互”。

添加了粗体文本以抵消导致模糊的文本墙效果。

0 投票
2 回答
3500 浏览

c# - Windows 服务无法在 Windows 7 中获取屏幕截图

我有一个获取屏幕截图的 Windows 服务。但它只创建黑屏。我知道这是由于会话 0 隔离而发生的。我在互联网上搜索并找不到任何批准的解决方案来解决这个问题,任何可行的想法都会非常好。

1-有没有办法改变windows服务的会话并获得另一个用户会话的桌面屏幕,如会话1、会话2?

2-有没有办法启动一个控制台应用程序,该应用程序在 Windows 服务的会话 0 以外的另一个会话中运行?

0 投票
0 回答
2530 浏览

windows-services - Windows 媒体播放器无法在 Win7 和 Win Server 2008 的 Session 0 中播放 rtsp 和 mms 流 url

在 Windows Server 2003 中,我们开发了一个程序。架构是:(1)有一个Service(称为ServA),(2)有一个进程(称为ProcB),它是通过实现一些必要的WMP接口来覆盖Windows Media Player。(3)ServA会通过CreateProcess启动ProcB来播放流url。ServA 和 ProcB 都在 Session 0 中。

在 Server 2003 中,它运行良好。

现在我们将其传输到 Windows Server 2008。在 Server 2008 中,它可以正常使用 http 协议 url(如 http://xx/xx.wmv)。rtsp和mms协议url(如rtsp://xx/xx.wmv、mms://xx/xx.asf)无法播放成功,返回错误码:0xC00D11B1,错误描述:“Windows Media Player遇到播放文件时出现问题。”

如果我们不将 ServA 作为服务启动,而只是双击启动它。那么ServA和ProcB都在Session 1中,这时候rtsp和mms协议url就可以播放成功了。

在Win 7中,这个现象与Server 2008相同。我们检查了我们的显示和声音设备,我们可以保证它们没有问题。

您可以链接此网址http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/0317c921-dc9c-4e95-9800-77a34f9f516a了解更多详情。

0 投票
0 回答
680 浏览

opengl - Windows 7 服务中的 OpenGL

有没有办法从 Windows 7 服务使用硬件加速的 OpenGL?正常的 Session 0 无法访问显卡驱动程序。

有没有办法配置这可能的服务(例如指定用户)?

我知道有可能启动一个新进程,但使用 IPC 会使使用硬件加速的整个目的变得毫无用处。

我还检查了这个 SO questions,但它也创建了一个新流程。