static WindowsIdentity.Impersonate(IntPtr) vs non-static Imp
本文关键字:vs non-static Imp IntPtr WindowsIdentity Impersonate static | 更新日期: 2023-09-27 18:33:48
我对Web应用程序的模拟做了一些研究,最终使用了这种方法,它基本上使用LogonUser
,newId = new WindowsIdentity()
和newId.Impersonate()
。
注意:我宁愿不在此处粘贴整个代码,因此帖子不会太长。
网络上的几个示例中使用了相同的代码,因此它看起来非常可靠。但后来我也发现了类似的方法。
第一个使用此实例方法:
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);
}
}
与
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:如果我无论如何都要处理WindowsImpersonationContext
对象,是否有必要调用Undo()
?例如:
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
// Whatever
impersonatedUser.Undo(); // Is this useful?
}
文档建议调用它,但未能指定Dispose()
是否已经这样做了。根据我的测试,处理对象就足够了。
子问题3:打电话给DuplicateToken()
或RevertToSelf()
有什么好处?我已经在一些例子中看到过它们,比如这个和这个,但我找不到任何使用它们的理由。
非常感谢您阅读我的整篇文章,
安德鲁
静态方法在内部调用相同的代码,因此它更像是一个快捷方式。
不,如果您在使用块中使用它,则不需要调用撤消,因为"处置"将调用撤消。 您应该在 using 块中使用它来正确处理抛出的异常以及不抛出的异常,除非您知道自己在做什么。
我不确定为什么CloseHandle在头等舱中。