【问题标题】:c# application authorization based on Windows current userc#基于windows当前用户的应用授权
【发布时间】:2014-08-15 18:53:23
【问题描述】:

我写了一个小应用,需要添加一些授权安全提示。

简单示例: 我有一个包含两个按钮的 WinForm:btnAdd 和 btnDelete。我想要那个:

  • 如果当前用户在Administrator组中,以上两个按钮都会显示

  • 否则(如果不在管理员组中(如猜测帐户))只会显示 btnAdd。

我该怎么做

【问题讨论】:

    标签: c# authorization


    【解决方案1】:

    您应该能够构造一个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) 给我管理员帐户的真实信息,并注意它的类型是管理员的帐户,在我看来我的帐户不在管理员组中
    • @mlivme2 我已经更新了答案,如果用户是本地administrators 组的成员或属于该组的另一个组的成员,它应该返回true。我还添加了信息以帮助您确认用户是管理员,以备您需要时使用
    • 我运行命令net localgroup administrators,它告诉我我在Administrators 组中,我也测试了net user CurrentUser,它给出了相同的结果。当我在管理员帐户中运行您的代码时,该按钮按预期可见,但是当我在我的帐户(位于 administratorS 组中)上运行它时,该按钮不可见,我不知道为什么??
    • 无论如何我接受这个答案,因为它是正确的,但在 cmets 中提到的问题仍然没有解决。非常感谢您的帮助
    猜你喜欢
    • 2012-06-04
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2011-09-18
    • 2011-09-28
    • 2013-02-06
    相关资源
    最近更新 更多