用户模拟是一种在应用程序执行过程中临时改变用户上下文的技术。这种技术允许应用程序在执行特定任务时,切换到另一个用户的上下文中去。这样做的原因通常是因为当前用户上下文没有足够的权限去执行某些任务。虽然可以给执行应用程序的用户赋予更多的权限,但出于安全考虑,这通常不是一个好主意,或者在某些情况下(例如,如果没有完全的管理员权限)是不可能的。
本文介绍了一个易于使用的类,用于模拟用户。在编写这个类的过程中,发现Marc Merrit已经写过一篇名为《使用C#进行Windows模拟》的文章,使用了相同的Microsoft知识库代码(来自Q306158)。文章中的代码与他的不同之处在于,代码可以在using块中使用,以安全地释放资源,并且使用了更多的异常来报告错误。但从第一眼看,文章都做了同样的工作,所以可以选择认为合适的方法。
背景:编写了Impersonator类,是因为需要编写一个ASP.NET网页来使服务器重新启动。为了做到这一点,需要模拟执行实际重启操作的那部分代码。
类的构造函数内部通过P/Invoke调用Windows函数LogonUser。有关该函数的三个参数(用户名、域、密码)的完整描述,请参见MSDN文档。
请注意:启动模拟的用户上下文(即不是切换到的用户上下文)需要设置“作为操作系统的一部分”的权限。
使用代码:要使用这个类,只需要构造Impersonator类,并将用户名、域和密码传递给构造函数。如果将类的实例放在using块中,就不需要进一步的步骤了。
以下是一个如何使用类的示意性示例:
C#
...
using (
new Impersonator(
"myUsername",
"myDomainname",
"myPassword"
)
) {
...
// 在新上下文中执行的代码
...
}
...
本文下载中包含了一个示例项目,演示了这种技术(请查看"Program.cs"以获取主要演示源文件)。类的完整源代码包含在源文件"Impersonator.cs"中。
要将Impersonator类包含到项目中,只需复制并添加源文件"Impersonator.cs"到项目中,这样它就会与项目一起编译。
结论:在本文中,向展示了一个小型类,可以快速轻松地模拟代码的一部分,以在另一个用户上下文中运行。希望会发现这个类很有用。