【发布时间】:2014-08-15 18:53:23
【问题描述】:
我写了一个小应用,需要添加一些授权安全提示。
简单示例: 我有一个包含两个按钮的 WinForm:btnAdd 和 btnDelete。我想要那个:
如果当前用户在Administrator组中,以上两个按钮都会显示
否则(如果不在管理员组中(如猜测帐户))只会显示 btnAdd。
我该怎么做
【问题讨论】:
标签: c# authorization
我写了一个小应用,需要添加一些授权安全提示。
简单示例: 我有一个包含两个按钮的 WinForm:btnAdd 和 btnDelete。我想要那个:
如果当前用户在Administrator组中,以上两个按钮都会显示
否则(如果不在管理员组中(如猜测帐户))只会显示 btnAdd。
我该怎么做
【问题讨论】:
标签: c# authorization
您应该能够构造一个WindowsPrincipal 对象,然后只需检查用户是否处于您期望的角色,并使用返回值将按钮设置为可见或不可见。类似下面的东西
using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
{
WindowsPrincipal principal = new WindowsPrincipal(identity);
// using WindowsBuiltInRole.Administrator or "BUILTIN\\Administrators" should work
btnAdd.Visible = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
更新后的代码有效,我已经测试过了,我是本地管理员,因为你想测试当前用户,WindowsIdentity.GetCurrent() 实际上更干净。
如果您需要确认您是否是机器上的管理员,您可以通过 MMC 检查组成员身份,但如果涉及任何域组并且您没有访问权限,则无法访问除非您有权访问 AD,否则请通过 MMC 进行检查。
验证用户是否是组成员的可靠方法是在命令提示符窗口中运行以下命令
获取本地管理员组的成员:
net localgroup administrators
获取域组的成员:这是必要的,例如,mydomain\WorkstationAdmins 是本地管理员组的成员,userId 是 的成员>mydomain\WorkstationAdmins(因此是 wokstation 的管理员)
net group "WorkstationAdmins" /domain
【讨论】:
principal.IsInRole(Principal.WindowsBuiltInRole.Administrator) 给我管理员帐户的真实信息,并注意它的类型是管理员的帐户,在我看来我的帐户不在管理员组中
administrators 组的成员或属于该组的另一个组的成员,它应该返回true。我还添加了信息以帮助您确认用户是管理员,以备您需要时使用
net localgroup administrators,它告诉我我在Administrators 组中,我也测试了net user CurrentUser,它给出了相同的结果。当我在管理员帐户中运行您的代码时,该按钮按预期可见,但是当我在我的帐户(位于 administratorS 组中)上运行它时,该按钮不可见,我不知道为什么??