多年来,我们一直在一个类中使用这个 VB.NET 代码来测试给定用户是否是管理员(为清楚起见而缩短,删除了错误检查):
Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As UInteger, ByVal dwLogonProvider As UInteger, ByRef phToken As IntPtr) As Boolean
Private token As IntPtr
Private identity As WindowsIdentity
Private principal As WindowsPrincipal
LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, token)
identity = New WindowsIdentity(token)
principal = New WindowsPrincipal(identity)
Return principal.IsInRole(ApplicationServices.BuiltInRole.Administrator)
此代码为管理员凭据返回 True。此代码适用于 Windows XP、Vista 和 Windows 7。我们知道此代码与打开的 UAC 不兼容。因此,为了让这段代码在 Windows Vista 和 7 中运行,我们关闭了 UAC。然而,在 Windows 8 中,即使关闭 UAC,管理员凭据仍被识别为受限令牌(BuiltInRole.User 的一部分)。所以我们不能用“identity.Impersonate”来冒充管理员。
任何想法为什么此代码在 Windows 8 上被破坏?
谢谢亚历克斯