Wednesday, December 22, 2010

Control Flow VS Data Flow in SSIS(ZT)

From http://www.bidn.com/blogs/BradSchacht/ssis/305/control-flow-vs-data-flow

Control Flow:

  • Process is the key:  precedence constraints control the project flow based on task completion, success or failure
  • Task 1 needs to complete before task 2 begins
  • Smallest unit of the control flow is a task
  • Control flow does not move data from task to task
  • Tasks are run in series if connected with precedence or in parallel
  • Package control flow is made up of containers and tasks connected with precedence constraints to control package flow

Data Flow:

  • Streaming
  • Unlink control flow, multiple components can process data at the same time
  • Smallest unit of the data flow is a component
  • Data flows move data, but are also tasks in the control flow, as such, their success or failure effects how your control flow operates
  • Data is moved and manipulated through transformations
  • Data is passed between each component in the data flow
  • Data flow is made up of source(s), transformations, and destinations.

Hopefully this will help you understand the differences between the control and data flows.

Monday, December 20, 2010

[转]为你解惑之WPF经典9问详解

http://blog.csdn.net/kissqi/archive/2010/09/06/5866882.aspx

 

第0问:能否简单介绍一下本文的结构?

  本文解答了关于WPF的9个最常见的问题。从某种意义上讲,这两种技术是相互关联的:它们都是关于界面表现的技术,更进一步的,Silverlight是基于WPF的,是它的一个子集。不仅从理论上介绍了这两种技术,同时还提供了一些小的例子供大家参考。

  第1问:我们已经有了GDI、GDI+和DirectX,为什么我们还需要WPF呢?


图1 从User32到WPF的发展历程

  首先,让我们来回顾一下微软的各种界面显示技术:
  User32:它提供了最基本的Windows界面,包括按钮,编辑框和其他UI元素。但是,User32缺乏的是图形图像的绘制功能,无法对屏幕实现自定义的绘制。

  GDI (Graphics device interface):- 为了提供图形图像的绘制功能,微软在User32的基础上引入了GDI。GDI不仅提供了图形图像的绘制功能,同时还对硬件显示进行了更高层次的抽象。换句话说,它将硬件的复杂性封装在了GDI API中,用户使用起来更加方便。

  GDI+:顾名思义,GDI+是作为GDI的扩展而被引入到Windows中的。它提供了很多GDI所没有的扩展功能,例如对JPG和PNG图像格式支持,渐变阴影和抗锯齿等。无论是GDI还是GDI+,它们最大的局限就是不支持硬件加速,同时无法展现动画和3D图像。

  提示:所谓硬件加速,就是使用硬件来执行某些功能,以替代使用软件在CPU中执行的某些功能,因为直接使用硬件,这样可以显著地加快图形图像处理的速度。

  DirectX :正如我们在上面所分析的那样,GDI及其扩展GDI+的一个最大问题就是不支持硬件加速和动画。这对于游戏开发者来说,是无法接受的。为了解决这个问题,微软开发了DirectX。DirectX能够很好的利用硬件加速,能够支持3D,全彩图像,流媒体等等,非常适合游戏工业等对图形图像处理要求比较高的领域。

  WPF:微软已经有了这么多套关于显示技术的API,为什么还要多此一举,创建另外一套显示技术的API呢?通过对硬件加速的支持,DirectX已经有了很多非常棒的特性。微软想利用支持硬件加速的DirectX技术来开发UI元素,比如文本框,按钮,网格等等,所以他们又在DirectX的基础上开发了WPF。因为WPF是在DirectX的基础上实现的,所以你不仅可以利用WPF创建简单的UI元素,还可以更进一步,开发特殊的UI元素,例如网格 (Grid),流文档(FlowDocument)和椭圆(Ellipse)等。

  更进一步地,你还可以利用WPF创建动画。如果你在寻找用于创建轻量级动画(不是游戏中所使用的那种复杂三维动画)的技术方案,WPF将是一个不错的选择。你可以使用被称为XAML的XML文件来表现WPF。


图2 WPF和DirectX的关系

  简单的讲,WPF就是DirectX之上的一层包装。所以,我们可以这样定义WPF:

  WPF是一套用于简便地构建动态用户界面的类的集合。这些类包括了一套新的界面控件。其中有些控件跟旧有的UI元素是相似的,例如标签,文本框和按钮等,而另外一些控件则是全新的,例如,网格(Grid),流文档(FlowDocument)和椭圆(Ellipse)等。

第2问:WPF中的硬件加速是如何工作的?

  正如我们在前文所介绍的那样,简而言之,硬件加速就是利用硬件来替代软件算法以充分利用硬件所固有的快速运算的特性。
WPF从以下三个层次上来利用硬件加速的特性:


图3 WPF硬件加速的三个层次

  WPF API首先检测你的硬件系统所支持的硬件加速的等级,比如显卡的显存大小,像素深度等等。基于你所使用的硬件,WPF将从以下三种渲染模式中的选择一种作为其渲染模式:

  •第0级
  如果你的显卡不支持硬件加速,WPF将采用第0级渲染模式。也就是说它将使用软件加速。这相当于使用低于7.0版本的DirectX。
  •第1级
  如果你的显卡部分地支持硬件加速,那么WPF将采用第1级渲染模式。这相当于使用版本号在7.0到9.0之间的DirectX。
  •第2级
  如果你的显卡完全支持硬件加速,那么WPF将采用第2级渲染模式。这相当于使用版本号等于或者大于9.0的DirectX。
第3问:这是否意味着WPF将取代DirectX?

  不,WPF并不会取代DirectX。DirectX将继续用于创建顶级的三维游戏。DirectX的视频性能在很多时候还是高于WPF API的。当用于游戏开发的时候,从性能的角度考虑,我们总是会选择DirectX,而不是WPF。WPF并不是设计游戏的最佳方案,当然,你可以用 WPF来实现一个简单的俄罗斯方块游戏,但是对于一些需要很多动画的三维游戏,WPF就显得力不从心了。

  我们只需要记住一点:WPF是Windows窗体的替代者,而不是DirectX的掘墓人。

第4问:那么,如何更加准确地定义WPF呢?

  WPF(Windows Presentation Framework)是一套全新的用于Windows 的显示子系统。WPF拥有一个二维和三维图形引擎。它拥有以下这些特性:

  •Windows界面
  WPF支持所有通用的Windows控件,例如按钮,复选框,滑动条等等。无论其界面使用哪种样式,WPF 应用程序都可以通过面板进行基本布局。一个面板通常包含多个控件,这些由 WPF 提供的控件包括按钮、文本框、组合框、菜单以及其他对象。这些控件如何放置取决于你所选择的面板类型。例如,网格(Grid) 允许将控件放在指定的网格上,而 画布(Canvas) 则允许开发人员将控件放在其界限范围内的任何位置。在 GUI 中,通常用户触发的事件由应用程序中的不同控件和其他类进行捕获和处理。在WPF中,我们还可以将样式和模板应用到控件组,这样就可以非常容易使应用程序具有一致的外观。

•对文档的支持
  WPF 应用程序可以使用 XAML 的 FixedDocument 标记来显示 XPS 文档。也可以使用 FlowDocument 标记来显示流文档。流文档与传统的屏幕文档类似,能够让用户滚动浏览其内容。另外,开发人员通过设置此标记的不同属性,可以使文档更适应其环境。例如,文档可以每次显示一页,这样读者就不必上下滚动页面了。WPF 还能够根据显示文档的窗口大小来自动确定应该把文档拆分成多少列。其目的是尽量提高屏幕上文档的可读性。

  •对图形的支持
  WPF 还支持创建二维和三维矢量图形。对于二维图形,WPF 可提供标准抽象,例如形状、画笔和绘图笔,同时还允许三维图形定义模型,以用于指定光线和摄像机位置信息。与早期技术(例如 Windows Forms 需要依赖于 GDI+ 才能绘制图形)不同的是,WPF 图形并不是使用开发人员所必须了解的单独一组概念来进行分区的。相反,用于图形的 XAML 元素能够与那些用户界面其他方面的元素自然组合。按钮可带有图形内容,文本和图形可以组合等。

•对图像的支持
使用 XAML 的图像标记,WPF 应用程序可以显示不同格式的图形,包括 JPEG、GIF 以及其他格式。WPF 依靠 Windows Imaging Component (WIC) 为编解码器以及显示和存储图像的软件提供标准框架。在WPF中,通常图像元素可以与其他元素组合,能够让按钮显示图像而不是简单的文本标签。

  •动画
  WPF 提供动态显示绝大部分用户界面的内置支持。例如,放大和缩小圆圈、平滑地更改按钮大小。应用程序还可以定义包含时间线的情节提要,允许调整动画的发生顺序。

  •多媒体
  WPF 应用程序可以使用 MediaElement 标记来显示不同格式的视频和音频,包括 WMV、AVI 和 MPEG。同样,此元素也可与其他 XAML 元素相组合,例如使三维立方体的所有侧面上都显示视频。
  ·数据绑定
  由于许多 WPF 应用程序都需要显示数据,因此提供将数据映射到用户界面元素的自动支持功能是很有帮助的。WPF 可为包含在对象和其他源中的信息提供此类数据绑定。WPF 数据绑定还允许在显示数据前对其进行排序和筛选。

第5问:什么是XAML?

  XAML(读作Zammel)是eXtensible Application Markup Language的英文缩写,它是一门基于XML的描述性语言。利用XAML,你可以用XML定义对象或者属性。在处理的时候,XAML文档首先被一个 XAML解析器加载,然后解析器会创建相应的对象实例并设置他们的属性。XAML描述了对象,属性和他们之间的关系。使用XAML,你可以创建各种对象,不管他们是图形的还是非图形的。WPF会负责解析XAML文档并根据文档中说定义的内容创建相应的对象实例,同时根据XAML中的描述创建他们之间的关系。

  所以,XAML是一个定义了对象和属性的XML文档。并且WPF会加载这个文档到当前内存空间以创建这些对象以及他们之间的关系。

第6问:XAML只是针对WPF的吗?

  不是的,XAML并不只是针对WPF而设计的。XAML是一门基于XML的标记语言并且它有多个变种:

  WPF XAML用于描述WPF相关的内容,比如WPF对象、控件和文档等。在WPF XAML中我们还有XPS XAML,它可以用于定义一个电子文档的XML表现形式。

  Silverlight XAML是WPF XAML的一个子集,专门用于Silverlight应用程序。Silverlight是一个跨平台的浏览器插件。利用Silverlight,我们可以创建丰富多彩的Web内容,包括二维图形,动画,音频和视频等。

  WWF XAML用于描述Windows Workflow Foundation(WWF)的内容。WWF引擎会加载XAML文档并按照其中的描述调用工作流。

第7问:能解释一下WPF的总体架构吗?


图4 WPF的总体架构

  上图展示了WPF的总体架构。WPF主要由三个部分构成:表现核心(Presentation Core)、表现框架(Presentation Framework)和媒体集成库(MilCore)。在图中,我们还可以看到WPF体系结构中的其他部分,例如DirectX在整个体系中的位置,操作系统与整个WPF系统的交互等等。下面让我们来看看WPF中各个部分都是如何工作的:
  User32:负责确定显示窗口及其在屏幕中的位置状态等,其并不参与常见控件的呈现。DirectX: - 如前所述,WPF在本质上是使用DirectX的。DirectX负责跟硬件驱动通信并显示窗口和窗口内容。

  Milcore:Mil是媒体集成库(Media Integration Library)的简称。这部分是非托管代码,因为它就像一座桥梁,负责托管的WPF和非托管的DirectX/User32 API之间的通信。

  Presentation core :这是WPF所公布出来的底层API。主要包括WPF的一些基本类型,例如UIElement,2D元素,3D元素,几何元素等。它们是Presentation Framework所包括元素的基础。
  Presentation framework:- 这是WPF所公布出来的高层API。它主要包括WPF的窗口、面板、样式,布局等高层WPF类型,通过这些内容,我们可以构建丰富的应用程序界面。

第8问:WPF中的名字空间和类层次是怎么样的?


图5 WPF的名字空间和类层次

  在WPF中,有10个比较重要的名字空间和类:

•System.Threading.DispatcherObject
  所有的WPF对象都派生自DispatcherObject。我们知道WPF工作在Single Threading Apartment(STA)模型下,DispatcherObject的主要职责就是处理线程的并发和同步。当有消息发生的时候,比如鼠标点击或者是按钮被按下,这些消息将被发送到DispatcherObject,它将负责验证代码是否运行在当前线程。在接下来的章节中,我们将详细介绍WPF的线程是如何工作的。

  •System.Windows.DependencyObject
  微软在设计WPF的时候,考虑的是一种基于属性的架构。换句话说,对象的行为主要是用属性来表现的,而不是方法,函数和事件。现在,我们只需要记住它的定义就可以了。在下面的章节中,我们将有专门的问题来论述这个主题。 
  •System.Windows.Media.Visual
  Visual是一个显示支持类,用于抽象所有关于绘制显示的描述。它是一个抽象类,每个Framework Element对象都必须继承该类。该类的主要作用是为WPF提供呈现支持,主要包括输出显示,透明度,坐标转换,区域剪切等。另外,Visual类同时是非托管的MilCore.dll和托管的WPF类之间的桥梁。如果一个类从Visual派生,它就可以在窗口中显示出来。这样,当你想创建你自定义的用户界面时,你就可以使用Visual对象。


图6 Visual是WPF和Micore.dll之间的桥梁

  •System.Windows.UIElement
  UIElement类主要处理三个方面的内容:布局,输入和事件。该类继承自Visual类,其中定义了很多与输入和焦点有关的特性,例如键盘事件,鼠标和笔输入等。同时,该类还包括一些与WPF事件模型有关的API。

  •System.Windows.FrameworkElement
  FrameworkElement派生自UIElement,在UIElement的基础上,它添加了很多其他功能,比如水平对齐,竖直对齐,边距,逻辑树、对象生命周期事件、支持数据绑定和动态资源引用、支持样式和动画等等。
  •System.Windows.Shapes.Shape
  这个类可以用于创建基本的图形,比如长方形,多边形,椭圆,线和路径等。

  •System.Windows.Controls.Control
  这个类提供一些基本的界面控件,比如文本框。按钮,列表框等。另外,它还添加了一些扩展属性,比如字体,前景色和背景色等。

  •System.Windows.Controls.ContentControl
  ContentControl用于显示连续的一段内容。利用ContentControl,我们可以在面板上利用Label显示多行文本。

  •System.Windows.Controls.ItemsControl
  这是所有能够支持多个条目显示的控件的基类,例如列表框和树形视图。

  •System.Windows.Controls.Panel
  面板(Panel)可以用做所有布局的容器。它可以包含一个或多个子控件并且可以将他们按照布局单位进行排列。这些容器是WPF布局系统的基础,并且合理地使用容器是对你的界面内容进行灵活布局的关键。

第9问:能结合实例解释一下WPF中的不同元素吗?

  为了理解WPF中的不同元素,我们将创建一个简单的实例“Hello World”,在这个过程中,我们将逐个解释WPF的不同元素。

  提示 :为了完成这个示例,你需要Visual Studio 2008 Express Edition.

  首先,让我们启动Visual Studio 2008 Express并且创建一个新项目,项目模板选择“WPF Application”,如下图所示:


图7 创建新的WPF项目

  一旦我们创建了“WPF Application”项目后,我们就会在项目中看到两种文件类型:一种是XAML文件,另外一种就是界面背后的代码文件,比如XAML.cs。 XAML文件其实就是XML文件,其中包含了所有需要在Windows界面上显示的元素。每个XAML元素对应于某个类。比如,XAML文件中的 “Window”元素就对应于“WpfApplication1.Window1”类,“Button”元素对应于 “System.Windows.Control.Button”类,而“Grid”元素对应于 “System.Windows.Control.Grid”类。


图8 XAML元素和类的对应关系

SharePoint Info (ZT)

从2004年算起来,专注于Sharepoint技术以及六七年了。从SPS2003,到MOSS2007,已经现在的Sharepoint Server2010 Beta2,Sharepoint技术可以说是迈过了一个又一个台阶,起码可以说,字面的功能是越来越强大。
国内的Sharepoint应用,应该说是从2007年进入了发展的阶段,虽然也有SPS2003下的应用,但是敢于尝鲜的企业毕竟很少,而且说实话,SPS2003下做企业应用,实在是太困难了,所谓的团队协作只能是个供销售人员忽悠的概念,干不了多少实在的事情。MOSS2007发布后,国内的应用渐渐多了起来,北京的几家专注于Sharepoint技术的公司,日子也渐渐好了起来,MOSS也终于成为了微软增长最快的一个产品,一年为微软拿下了10亿美元的利润。
几年过去了,国内那些看重了Sharepoint技术并实施了Sharepoint项目的企业,究竟都从项目中获得了哪些利益,我无从考证。作为一直致力于使用Sharepoint技术为企业搭建应用环境的IW,我一直在困惑,企业究竟该如何实施Sharepoint技术,才能让这项技术真正的带来好处。
说起来,我也算是参与过一些项目,而且也号称是Sharepoint架构方面的MVP,让我惶恐的是,对于Sharepoint这样庞大的一个产品,几年下来我都没能彻底掌握它的架构,以及规划的原则。就我的理解,微软几乎所有的服务器产品,实施前都需要非常详细的项目规划,而规划的制定需要对架构有透彻的理解。
就拿内容管理来说吧。Sharepoint技术能够提供给客户的最实惠的应用,其实就是内容管理。说句不好听的,就算是花上几十万甚至是上百万做一个 Sharepoint项目,别的功能都不要,就做内容管理,能够真正运用此技术,把企业内部的信息分门别类的管理好,让所有的信息处在最恰当的状态:所有需要的人能够随时得到,所有无权的人永远看不着,那也是一件非常了不起的事,对企业来讲,也算是超值了。可实际的效果怎样呢?
说起来可能都认为很简单,不就是内容管理么!先把信息分类,然后按分类分别创建站点、文档库、文件夹,然后分别赋予各自的权限,不就OK了嘛!看起来好像是这么回事,实际上没那么简单。先说分类,如果一个企业想把内容管理做好,企业内部必须有专门的档案管理的人才,不但要求对档案管理的流程和具体内容非常清楚,而且要对分类学相当了解,就这一点,估计国内很少的企业具备这样的条件。不是说不具备这样的能力,而是说没有这方面的意识。企业尚且如此,做 Sharepoint项目的IT公司,更不能指望了,再说这个也确实不是技术的问题,不属于IT公司的职责范畴。
当然,肯定会有公司具备这样的能力,因此对内容管理会有更清晰的要求。接下来就是安全方面的规划了,这是实施Sharepoint项目的IT公司本职的工作。然而Sharepoint的安全体系,也是比较复杂,关于Sharepoint用户、用户组还有访问群体,搞得我都眼晕。记得2007年在微软 BPIO培训的课上,我曾专门问过讲课的老师他们之间的关系和标准的做法,那个来自比利时的微软的帅小伙倒是十分耐心的给我讲了半天,由于英语不太灵光,我也只听了个大概。后来从微软的网站上找到了MOSS2007的规划指南,仅仅安全部分的规划就有非常厚的一沓,而且这东西不是看一遍就能够深入理解的,于是至今我都不能很好的规划安全。这里还要用到许多的基础架构的知识。对于Sharepoint技术来说,最佳的环境是微软的域环境,而实际的情况却是,很多客户没有域环境,并且很排斥域环境。专业的Sharepoint项目公司,也不是都有能够很好规划域环境的专门的人才,要知道这方面的知识属于微软系统工程师的范畴,而要真正获得MCSE的能力(不是Paper MCSE),也不是一朝一夕的事,所以最后的结果,大家可想而知。
我个人认为,对于Sharepoint技术来讲,除了对企业非常实惠的内容管理外,更大的价值在于,它是一个企业信息化的平台,是一个骨架,企业的所有的应用都可以透过它,来完成各自的工作,并且通过这个平台,来展现企业信息的各个方面。
这么说起来有点虚,统一的企业应用平台就不说了,就说Excel Service提供的商务智能。一个企业会有各种各样的应用,无论是什么架构,比方说我们现在使用的用友的财务系统,基于B/S架构。除了利用 Windows 2008的终端服务网关和用于发布终端服务的TSWebpart,是分支办公室通过内部办公门户远程使用财务系统外,我们可以使用Excel Service去财务系统中,提取我们需要的任何信息,生成用友并没有提供的实时报表,放在领导的桌面上。
2008年底,我又回到了熟悉的企业环境,开始用Sharepoint技术搭建企业的信息化平台,整整一年过去了,我也只是简单搭了个环境,关于 Sharepoint的本身的基本的内容管理功能,并没有开始真正的使用,因为这是个新企业,还没有成熟的管理。我和一个开发的搭档花了半年的时间,开发一个成品的库存管理系统,集成在Sharepoint的平台之上。虽然领导要求的库存管理只需要知道实时库存即可,但是通过Excel Service,我还是很轻松的将生产入库情况分析、每日累计出货情况、经销商出货情况、销售分区年度出货情况、销售分区实时出货情况、纸箱消耗情况等等,与生产销售有关的报表放在了领导的桌面上。我认为,这些隐含于系统内部的各类数据的分析,才是真正体现Sharepoint技术价值的另一个最重要的方面,也是企业最需要解决的问题。因为围绕这一个产品库存,我们公司起码有8名员工,每天的很多时间花费在这个上面,而且做出的Excel文件的报表,数据的重复利用能力几乎为零,现在有关这方面的统计工作,已经被彻底解放了。
BTW,以上仅仅是我对Sharepoint技术的一些看法,文中的一些观点是我个人实事求是的看法而已,没有任何贬低国内Sharepoint应用水平的意思。而且我也勉强算是Sharepoint的圈内人士,希望能够紧跟Kaneboy、熊总、Choral、Erucy、Kevin等各位大牛的脚步,为这项技术的发展出一份力。尽管如此,我依然做好思想准备,双手抱头,以躲避四处飞来的板儿砖!呵呵

(ZT)MOSS/Sharepoint 开发中代码运行的权限级别的讨论

 

FROM : http://www.cnblogs.com/Creator/archive/2010/12/20/1909284.html

 

用MOSS 2007来进行工作流和其它的开发,其中会涉及到一些权限的问题。现在将我碰到的一些问题与大家分享:
一.WebPart和事件处理程序EventHandler,运行是的权限是以当前登录用户的权限为准。
二.SPD中的工作流活动,所有活动,比如更新列表,删除项目,等等都是以当前的用户权限进行。
三.自己开发的工作流代码,都是以系统管理员的权限进行,比如你在进行工作流的Activity的开发时不需要提升程序的运行级别就可以删除列表中的项目。

那么如何提升MOSS Event Handler事件处理程序运行级别呢?

方法一:模拟管理员权限

不论是在工作流或是EventHandler中,我们经常希望模拟管理员权限,从而可以通过程序自定义列表项的权限。

在工作流中可以用如下代码来提升权限:(以下代码实现的功能是断开列表项所继承的权限,除管理员以外)

SPListItem item = workflowProperties.Item;

SPSecurity.RunWithElevatedPrivileges(delegate()      //用此方法模拟管理员账户运行此事件处理程序
                {
                    using (SPSite site = new SPSite(workflowProperties.SiteId))    //用此方法的话就不用dispose()了
                    {
                        using (SPWeb web = site.OpenWeb(workflowProperties.WebId))  //注意获得web的方法!!!
                        {
                            try
                            {
                                if (!item.HasUniqueRoleAssignments) item.BreakRoleInheritance(false);   //将此条目取消权限继承,如果是“false”,则将去除所有权限,只保留系统账户,如果是“true”,则将上一级权限复制过来。
                            }
                            catch (Exception ex)
                            {

                            }
                        }

                    }
                }
                    );

但是,在 EventHandler中沿用以上代码,在调用列表项item实例进行操作时(如item.BreakRoleInheritance),会提示“没有权限”。根本原因是item实例不是在RunWithElevatedPrivileges代码段中实例化的。也就是说item必须在 RunWithElevatedPrivileges中进行实例化,代码如下:

SPSecurity.RunWithElevatedPrivileges(delegate()      //用此方法模拟管理员账户运行此事件处理程序
                {
                    using (SPSite site = new SPSite(properties.SiteId))    //用此方法的话就不用dispose()了
                    {
                        using (SPWeb web = site.OpenWeb(properties.OpenWeb().ID)) //注意获得web的方法!!!
                        {
                            try
                            {
                                SPList list = web.Lists[properties.ListId];
                                SPListItem item = list.Items.GetItemById(Convert.ToInt32(properties.ListItemId));
                                //SPListItem item = properties.ListItem.ID;
                                //清空所有权限
                                if (!item.HasUniqueRoleAssignments) item.BreakRoleInheritance(false);   //将此条目取消权限继承,如果是“false”,则将去除所有权限,只保留系统账户,如果是“true”,则将上一级权限复制过来。
                            }
                            catch (Exception ex)
                            {

                            }
                        }

                    }
                }
                    );

方法二:用API模拟管理员登录的方法



//以下用户管理用户来登录

protected static WindowsIdentity CreateIdentity(string User, string
            Domain, string Password)
{
// The Windows NT user token.
            IntPtr tokenHandle = new IntPtr(0);

const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_NETWORK = 3;

            tokenHandle = IntPtr.Zero;

// Call LogonUser to obtain a handle to an access token.
bool returnValue = LogonUser(User, Domain, Password, 
                LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,
ref tokenHandle);

if (false == returnValue)
{
int ret = Marshal.GetLastWin32Error();
throw new Exception("LogonUser failed with error code: " +  ret);
            }

            System.Diagnostics.Debug.WriteLine("Created user token: " +
                tokenHandle);

//The WindowsIdentity class makes a new copy of the token.
//It also handles calling CloseHandle for the copy.
            WindowsIdentity id = new WindowsIdentity(tokenHandle);
            CloseHandle(tokenHandle);
return id;
        }

        [DllImport("advapi32.dll", SetLastError=true)]
private static extern bool LogonUser(String lpszUsername, String
            lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

        [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
private extern static bool CloseHandle(IntPtr handle);

使用的时候, 应该这样使用:

WindowsImpersonationContext wic = CreateIdentity ("用户","域名","密码") .Impersonate();

使用完毕,应该释放权限:

wic.Undo ();