我对Web应用程序的模拟做了一些研究,最后我使用了this approach,它主要使用LogonUser
,newId = new WindowsIdentity()
和newId.Impersonate()
。
注意:我不想在此粘贴整个代码,因此帖子不会太长。
在Web上的几个示例中使用了相同的代码,因此它看起来非常可靠。但后来我也找到了this similar approach。
第一个使用此实例方法:
public virtual WindowsImpersonationContext Impersonate()
第二个,这个静态方法:
public static WindowsImpersonationContext Impersonate(IntPtr userToken)
示例代码的唯一区别是:
using (WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle()))
{
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
// Check the identity.
Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
}
}
VS
using (WindowsImpersonationContext impersonatedUser = WindowsIdentity.Impersonate(safeTokenHandle.DangerousGetHandle()))
{
// Check the identity.
Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
}
一个人对另一个人有什么好处吗?仅仅为了简单起见,我认为如果WindowsIdentity
对象没有以任何其他方式使用,第二个更好。
子问题1 :这个代码是在课程开头需要的吗?它永远不会被调用和评论它似乎根本不会影响功能。只调用SafeTokenHandle
中的那个。
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
子问题2 :如果我将处置Undo()
对象,是否需要调用WindowsImpersonationContext
?例如:
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
// Whatever
impersonatedUser.Undo(); // Is this useful?
}
文档建议调用它,但未指定Dispose()
是否已经这样做。根据我的测试,处理对象就足够了。
子问题3 :调用DuplicateToken()
或RevertToSelf()
有什么好处?我在this one和this one等示例中看过它们,但我找不到任何理由使用它们。
非常感谢阅读我的整个帖子,
安德鲁
答案 0 :(得分:1)
静态方法在内部调用相同的代码,因此它更像是一种快捷方式。
不,如果您在using块中使用它,则无需调用Undo,因为Dispose将调用Undo。您应该在using块中使用它来正确处理被抛出的异常,除非您知道自己在做什么。
我不确定为什么CloseHandle会在第一堂课中出现。