static WindowsIdentity.Impersonate(IntPtr) vs non-static Imp

本文关键字:vs non-static Imp IntPtr WindowsIdentity Impersonate static | 更新日期: 2023-09-27 18:33:48

我对Web应用程序的模拟做了一些研究,最终使用了这种方法,它基本上使用LogonUsernewId = 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()有什么好处?我已经在一些例子中看到过它们,比如这个和这个,但我找不到任何使用它们的理由。

非常感谢您阅读我的整篇文章,

安德鲁

static WindowsIdentity.Impersonate(IntPtr) vs non-static Imp

静态方法在内部调用相同的代码,因此它更像是一个快捷方式。

不,如果您在使用块中使用它,则不需要调用撤消,因为"处置"将调用撤消。 您应该在 using 块中使用它来正确处理抛出的异常以及不抛出的异常,除非您知道自己在做什么。

我不确定为什么CloseHandle在头等舱中。