对于任何 VB.NET 人(我知道你在那里......),这是我从各种来源炮制出来的一个版本,我认为,它经过优化以确定当前用户(包括提升的用户)是否在定义的管理员中组、机器或域,启用或不启用 UAC。(这篇文章非常感谢这里和其他地方的其他帖子!)
首先,它使用静态可空布尔值来保持管理员状态,因为虽然基本检查很快,但完整测试可能需要数十秒,所以你只想做一次 - 如果你能帮助它的话.
其次,它在基本测试不正确/错误方面出错,如果用户是 AD 管理的或本地计算机启用了 UAC,通常会出现这种情况。因此,如果它可以确定用户是管理员,它将.
第三,您可以根据需要在AuthorizationGroups中添加或删除条件,但其中包含的条件涵盖了大多数情况。
最后,如果出现任何问题,您将得到False;如果你想要一个错误,你可以有一个,但我个人不明白这一点。
Function IsAdministrator() As Boolean
Static bResult As Boolean? = Nothing
Try
If bResult Is Nothing Then
bResult = New WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)
If Not bResult Then
Dim oContext As PrincipalContext = Nothing
Try 'to get a domain context first ...
Domain.GetComputerDomain()
oContext = New PrincipalContext(ContextType.Domain)
Catch
'... if it fails, fall through to a machine context
End Try
If oContext Is Nothing Then oContext = New PrincipalContext(ContextType.Machine)
Dim oPrincipal As UserPrincipal = UserPrincipal.FindByIdentity(oContext, WindowsIdentity.GetCurrent().Name)
If oPrincipal IsNot Nothing Then
bResult = oPrincipal.GetAuthorizationGroups().Any(Function(p) _
p.Sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) OrElse
p.Sid.IsWellKnown(WellKnownSidType.AccountDomainAdminsSid) OrElse
p.Sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) OrElse
p.Sid.IsWellKnown(WellKnownSidType.AccountEnterpriseAdminsSid))
End If
End If
End If
Catch
bResult = False
End Try
Return bResult.GetValueOrDefault(False)
End Function