在我的C#应用程序中,我需要检查当前用户是否是管理员组的成员.它需要兼容
Windows XP和
Windows 7.
目前,我正在使用以下代码:
bool IsAdministrator { get { WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } }
问题是如果应用程序在Windows 7上运行,并且将UAC作为非升级的管理员启用,则此方法将返回false.即使应用程序作为非升级的管理员运行,我如何确定用户是否是管理员?
解决方法
有一个Win32 API GetTokenInformation可用于检查当前令牌.如果返回的令牌是拆分令牌,则它可能是运行非升级模式的管理员用户.
GetTokenInformation具有一个输出参数tokenInformation,它取三个值之一:
> TokenElevationTypeDefault = 1
> TokenElevationTypeFull = 2
> TokenElevationTypeLimited = 3
TokenElevantionTypeLimited的值表示用户正在以具有有限权限的拆分令牌运行.当提升时,返回TokenElevationTypeFull值.非管理员用户的值为TokenElevationTypeDefault.
有一个完整的代码示例为C#在http://www.davidmoore.info/2011/06/20/how-to-check-if-the-current-user-is-an-administrator-even-if-uac-is-on/