2013-02-04 38 views
1

我有一個WPF應用程序生成一些報告。我需要從一個WindowService啓動這個應用程序,並且我正在從一個作爲LocalSystem運行的服務執行它。 所有的渲染都正確完成,除了一個Pie 3d,顯示在Viewport3D對象中。 這是表示該行爲代碼提取:Viewport3d從Windows服務呈現

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

不幸的是,由於這一政策:

在WindowsXP®中,WindowsServer®2003用戶,和早期版本的Windows操作系統中,在同一個會話的第一個用戶誰登錄到運行的所有服務控制檯。此會話稱爲會話0.在會話0中一起運行服務和用戶應用程序會帶來安全風險,因爲服務以提升的權限運行,因此是正在尋找提升其自身權限級別的惡意代理的目標。


在WindowsVista®和WindowsServer®2008操作系統在會話0隔離服務,使會話0非交互式減輕這種安全風險。在Windows Vista和Windows Server 2008中,只有系統進程和服務在會話0中運行。第一個用戶登錄到會話1,隨後的用戶登錄到後續會話。這種方法意味着服務不會像用戶的應用程序一樣運行在同一個會話中,因此可以防止源自應用程序代碼的攻擊。

在windows 7 2008上,涉及視頻驅動程序的所有呈現均失敗。所以唯一的解決方案是讓應用公開一項服務並在桌面上運行。