我有一个WPF应用程序生成一些报告。我需要从WindowService启动此应用程序,我目前正在从作为LocalSystem运行的服务执行该应用程序。 除了在Viewport3D对象中显示的Pie 3d外,所有渲染都已正确完成。 这是一个显示行为的代码提取:
static class VisualSaver
{
public static void Save(Visual v, int width, int height, string file,Brush background)
{
RenderTargetBitmap bmp = new RenderTargetBitmap(
width, height, 96, 96, PixelFormats.Pbgra32);
Rectangle vRect = new Rectangle();
vRect.Width = width;
vRect.Height = height;
vRect.Fill = background;
vRect.Arrange(new Rect(0, 0, vRect.Width, vRect.Height));
bmp.Render(vRect);
bmp.Render(v);
PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(bmp));
using (Stream stm = File.Create(file))
{
png.Save(stm);
}
}
}
这是调用代码:
VisualSaver.Save(viewport,310,340,PathExtension.GetTempFileWithExtension("png"),Brushes.White);
是的,视口已正确测量/安排。
从3d对象的非交互式应用程序渲染是否有一些限制,我在Windows7 - 2008服务器环境中。 ? 有没有解决方法?
答案 0 :(得分:0)
不幸的是,由于这项政策:
在WindowsXP®,WindowsServer®2003和早期版本的Windows®操作系统中,所有服务都在与登录控制台的第一个用户相同的会话中运行。此会话称为会话0.会话0中的运行服务和用户应用程序一起构成安全风险,因为服务以提升的权限运行,因此是寻找提升其自身权限级别的方法的恶意代理的目标。
WindowsVista®和WindowsServer®2008操作系统通过隔离会话0中的服务并使会话0非交互式来降低此安全风险。在Windows Vista和Windows Server 2008中,只有系统进程和服务在会话0中运行。第一个用户登录到会话1,后续用户登录到后续会话。这种方法意味着服务永远不会在与用户应用程序相同的会话中运行,因此可以免受源自应用程序代码的攻击。</ em>
在Windows 7 2008上,涉及视频驱动程序的所有渲染都会失败。因此唯一的解决方案是让应用程序公开服务并在桌面上运行。