一个小型的 C# 类,用于模拟用户
介绍了一个简化 C# 中 Windows 身份模拟的类。
引言
术语“身份模拟”在编程上下文中指的是一种技术,该技术在与最初启动应用程序的用户不同的用户上下文中执行代码,即用户上下文在应用程序执行期间临时更改一次或多次。
这样做的原因是执行应用程序的当前用户上下文不允许执行的任务。 当然,您可以授予执行应用程序的用户更多权限,但通常这是一个坏主意(由于安全限制)或不可能(例如,如果您没有对计算机的完全管理访问权限来执行此操作)。
本文介绍了一个易于使用的类来模拟用户。 在编写本文时,我发现 Marc Merrit 撰写了一篇文章(“使用 C# 进行 Windows 身份模拟”),该文章使用了与我使用的相同的 Microsoft 知识库代码(来自 Q306158)。 我文章中提供的代码的不同之处在于,您可以在 using
块中使用它来安全地释放资源,并且我使用了稍微更多的异常来报告错误。 但从表面上看,他和我的文章都做了同样的工作,所以由您来决定该怎么做。
(最新变更请参阅下方历史记录部分).
背景
我编写 Impersonator
类是因为需要编写一个带有 ASP.NET 的网页来重新启动服务器。 为了做到这一点,我需要模拟我的代码中执行实际重启的部分。
该类的构造函数通过 P/Invoke 在内部调用 Windows 函数 LogonUser
。 有关构造函数的所有三个参数(username
、domain
、password
)的完整说明,请参阅 该函数的 MSDN 文档。
请注意:启动身份模拟的用户上下文(即,不是切换到的用户上下文)需要设置“作为操作系统的一部分执行”权限。
使用代码
要使用代码,您只需构造 Impersonator
类,并将 username
、domain
和 password
传递给构造函数。 如果将该类的实例放置在 using
块中,则无需进一步操作。
以下是如何使用该类的示意示例
...
using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
{
...
<code that executes under the new context>
...
}
...
示例项目演示了本文下载中包含的技术(请查看“Program.cs”以获取主要演示源文件)。 此外,该类的完整源代码包含在源文件“Impersonator.cs”中。
要将 Impersonator
类包含到您的项目中,只需复制并将源文件“Impersonator.cs”添加到您的项目,以便将其与您的项目一起编译。
结论
在本文中,我向您展示了一个小类,可以快速轻松地模拟您的代码的一部分,以在另一个用户上下文中运行。 希望您觉得这个类有用。
如有任何问题、意见和建议,请使用本文底部的评论区。
参考
除了文章中的链接外,以下参考资料可能也很有趣
- Google 搜索“Windows 身份模拟”
历史
- 2005-04-11:创建了文章的第一个版本。