0

多年来,我们一直在一个类中使用这个 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 上被破坏?

谢谢亚历克斯

4

1 回答 1

3

我不知道您为什么要冒充用户来检查组的成员身份。我认为以下内容将在 UAC 开启或关闭时起作用:

Public Shared Function IsLocalAdmin(ByVal userName As String) As Boolean
    Dim MyIdentity = New System.Security.Principal.WindowsIdentity(userName)
    Dim MyPrincipal = New System.Security.Principal.WindowsPrincipal(MyIdentity)
    Return MyPrincipal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)
End Function

关闭 UAC 不应该是程序的先决条件。

于 2013-05-28T09:34:29.573 回答